Posts tagged ‘Dateien’

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