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]) |