Posts tagged ‘XML’

XML-Dateien kombinieren mit Python

Vor kurzem hatte ich die Herausforderung, diverse XML Dateien zu kombinieren, die aufgrund einer Größenbeschränkung in einzelne, jeweils eigenständige, Dateien zerlegt worden waren. In jeder Datei fanden sich XML-Metaangaben in den ersten zwei und der letzten Zeile. Die Aufgabe bestand nun darin, den XML-Kopf und das XML-Ende nur einmal in der Ausgabedatei zu haben. An der folgenden Text-Datei kann man das gut erkennen:

Will ich nur einmal am Anfang
Will ich nur einmal am Anfang
Will ich 
Will ich 
Will ich 
Will ich 
Will ich 
Will ich nur einmal am Ende

Mit Python ging es dann recht einfach, elegant und ausreichend performant (3 jeweils über 100 MB große Dateien ließen sich in ungefähr 12 Sekunden kombinieren):

  • Die zu kombinierenden Dateien speichere ich in einem Array, hinzu kommt die Angabe des Ausgabepfads. Diese Information könnte man gegebenenfalls auch aus dem Dateisystem holen.
  • Wir öffnen die Ausgabedatei zum Schreiben
  • und nutzen dann ein enumerate, um den Zähler zu bekommen, bei welcher Datei wir gerade sind
  • Bearbeiten wir die erste Datei, so brauchen wir alles bis auf die letzte Zeile
  • Bearbeiten wir die letzte Datei, so brauchen wir nicht die ersten beiden Zeilen
  • Bei den Dateien 2 bis n-1 brauchen wir weder die ersten zwei noch die letzte Zeile
files = ['f:/willich.txt', 'f:/willich.txt',  'f:/willich.txt']
 
output = 'F:/kombiniert.txt'
filecount = len(files)
 
print(f'Processing {filecount} files')
 
with open(output, 'w') as outputfile: # Ausgabe öffnen
 
    for counter, file in enumerate(files):
        print(counter, file)
 
        with open(file, 'r') as fin:
            data = fin.read().splitlines(True)
 
        if counter == 0: # Erste Datei: alles bis auf die letzte Zeile
            outputfile.writelines(data[:-1])
 
        elif counter == filecount - 1: # letzte Datei, alles bis auf die ersten zwei Zeilen
            outputfile.writelines(data[2:])
 
        else: # die Dateien zwischen erster und letzter Datei, nicht die beiden ersten und die letzte Zeile
            outputfile.writelines(data[2:-1])

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Mit Python XML Tags aus XML-Dateien löschen

Kürzlich musste ich XML-Tags aus XML-Dateien löschen, um die entsprechenden XML-Dateien etwas übersichtlicher zu gestalten. Der richtige Weg wäre sicher gewesen, einen XSLT-Prozessor zu nutzen, der die entsprechenden Tags ausfiltert, aber mangels Zeit habe ich dann doch ein kleines Python-Skript gebaut. Die zu entfernenden Tags hatten auch keine Properties und ließen sich daher gut entfernen.

def filter(oldfile, newfile, filterStart, filterEnd):
    killFlag = 0
    with open(newfile, 'w') as outfile, open(oldfile, 'r', encoding='utf-8') as infile:
        for line in infile:
            strIndex = line.find(filterStart)
            if (strIndex > -1) | (killFlag == 1):
                killFlag = 1
            else:
                outfile.write(line)
                strIndex2 = line.find(filterEnd)
                if (strIndex2 > -1):
                    killFlag = 0
 
filter('somexmlfile.xml', 'somefilteredxml.xml', '<xs:annotation>', '</xs:annotation>')

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

XML Feeds parsen mit Python 2

Hier ein kurzes Beispiel, wie man mit Python XML Dateien parsen kann. Yahoo Developer hatte dazu einen guten Artikel. Der Datensatz der ECB ist zwar ziemlich doof, da hier mehrere CUBE Tags ineinander verschachtelt sind, dies stellt mit der hier genutzten Herangehensweise kein Hindernis dar.

import xml.etree.ElementTree as ET
import urllib2
 
root = ET.parse(urllib2.urlopen('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')).getroot()
 
for child in root[2][0]:
    #print child.tag
    #print child.attrib
    curr = child.get('currency')
    rate = child.get('rate')
    print curr, rate

UPDATE for Python 3 and pandas: https://www.uweziegenhagen.de/?p=4569.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Mindmaps aus Freemind nach LaTeX exportieren – Teil 2

Dies ist der zweite Teil der Reihe, Teil 1 liegt unter http://uweziegenhagen.de/?p=2032.

Schauen wir uns mal den Aufbau der FreeMind Datei an:

<map version="0.9.0">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1335794057887" ID="ID_1245350673" MODIFIED="1335794109247" TEXT="Zentrum">
<node CREATED="1335794071208" ID="ID_1530114542" MODIFIED="1335794074163" POSITION="right" TEXT="Level 1"/>
<node CREATED="1335794075246" ID="ID_1662348218" MODIFIED="1335794079639" POSITION="right" TEXT="Level 1">
<node CREATED="1335794081307" ID="ID_1399980217" MODIFIED="1335794085467" TEXT="Level 2">
<node CREATED="1335794088715" ID="ID_1065307715" MODIFIED="1335794091703" TEXT="Level 3">
<node CREATED="1335794092827" ID="ID_1370145863" MODIFIED="1335794094989" TEXT="Level 4">
<node CREATED="1335794096421" ID="ID_9970207" MODIFIED="1335794099648" TEXT="Level 5">
<node CREATED="1335794173930" ID="ID_919041832" MODIFIED="1335794177008" TEXT="Level 6">
<node CREATED="1335794178164" ID="ID_1274260836" MODIFIED="1335794180516" TEXT="Level 7"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
</map>

Es gibt ein map Tag, das entsprechende verschachtelte node Tags enthält. Wenn ein node Tag keine „Kinder“ hat, wird es am Ende der Zeile mittels „/“ geschlossen. node Tags mit „Kindern“ enthalten diese nodes und werden dann rekursiv geschlossen.

Schauen wir uns mal das XSLT an (Eine tiefgehende Einführung in XSLT kann ich hier jedoch nicht geben): Hinter dem Matching auf das map Tag wird die Text Eigenschaft des ersten node-Elements als part ausgegeben. Sehr interessant, an dieser Stelle können wir später ansetzen, um direkt ein kompilierbares LaTeX-Dokument zu erhalten.

Es gibt im Dokument noch drei weitere Matches:

  • richcontent
  • soll uns aktuell nicht interessieren, wird eventuell später mal behandelt.

  • node
  • Hier wird die Ausgabe der einzelnen node Tags gesteuert.

  • text
  • Dieses match steuert die Ausgabe der Notizen als einfachen Text, gehe ich eventuell später mal drauf ein.

In den node matches wird geschaut, wie tief sich der aktuelle Knoten befindet, in Abhängigkeit dessen wird das Text Attribut des Knotens einfach in ein entsprechendes LaTeX-Kommando eingebettet. Entsprechende Abschnitte wie den folgenden finden sich für alle Levels von \chapter bis \subparagraph.

Im nächsten Teil werden wir dieses XSLT Sheet auf unsere Bedürfnisse anpassen.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Mindmaps aus Freemind nach LaTeX exportieren – Teil 1

FreeMind ist meines Erachtens das beste OpenSource Tool für die Erstellung von Mindmaps, jedoch ist eine MindMap oft nicht das Format, das man zum Weiterbearbeiten benötigt. Neben diversen fertigen Export-Filtern für Grafikformate wie PDF oder PNG bietet FreeMind auch die Möglichkeit, eigene XSLT-Sheets für den Export zu nutzen. Das Rad muss man hier nicht komplett neu erfinden, mit Freemind to Latex gibt es schon ein entsprechendes Projekt, das eine passende XSLT Datei bereitstellt. Möchte man eine Mindmap exportieren, so geht man im „Datei“ Menü einfach auf den Export => „Mittels XSLT“ Eintrag und kann dann den Namen der Output Datei sowie das zu nutzende XSLT Sheet auswählen.

Mit der standardmäßigen mm2latexr_richcontent_v1.02.xsl erhält man für die Map aus dem Bild folgendes Ergebnis:

\part{Zentrum}
 
 
 
\chapter{Level 1}
\chapter{Level 1}
\section{Level 2}
\subsection{Level 3}
\subsubsection{Level 4}
\paragraph{Level 5}
\subparagraph{Level 6}

Man sieht:

  • Es fehlen Dokumentenpräambel und -struktur
  • Es wird nur bis Level 6 exportiert, danach fehlen die Inhalte (Laut der Webseite sollten eigentlich itemize Umgebungen daraus werden…)

Mit ein wenig XML/XSLT Kenntnissen lässt sich dieser Export aber sehr einfach auf die eigenen Bedürfnisse anpassen, was ich in Teil 2 zeigen werde.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website