2017-12-27 7 views
0

Ich versuche, XML-Dateien einzeln im Verzeichnis zu verarbeiten. Grundsätzlich lesen Sie die Werte und füllen Sie dann die CSV-Datei. Ich habe Probleme, jedes XML einzeln zu analysieren. Problem mit meinem Code ist csvWriter.writerow nur die Werte aus der letzten XML-Datei in das Verzeichnis schreiben. Auch ich habe eine Schleife für alle Elemente im Stamm von ElementTree.parse (Pfad). Ich möchte, dass es jede Zeile für jede XML-Datei im Verzeichnis schreibt.Schleife durch Variable mit os.path.join

from lxml import etree as ElementTree 
import csv 
import os 
import errno 
import shutil 


def writeData(item): 
    csvFile = open('D:\\metadata.csv', 'w', newline='') 
    csvWriter = csv.writer(csvFile, delimiter='|', 
          lineterminator='\n') 
    csvWriter.writerow([ 
     'type', 
     'object', 
     'title', 
     'subject', 
     'domain', 
     'name', 
     '_name', 
     'version_label', 
     'creator_name', 
     'creation_date', 
     'modifier', 
     'modify_date', 
     'content_type', 
     'chronicle_id', 
     'antecedent_id', 
     'activity_date', 
     'search_from_date', 
     'number', 
     'service_code', 
     'initial_inspection_date', 
     'search_to_date', 
     'File Name', 
     'Location', 
     ]) 
    csvWriter.writerow([ 
     root[0][0].text, 
     root[0][1].text, 
     root[0][2].text, 
     root[0][3].text, 
     root[0][4].text, 
     root[0][5].text, 
     root[0][6].text, 
     root[0][7].text, 
     root[0][8].text, 
     root[0][9].text, 
     root[0][10].text, 
     root[0][11].text, 
     root[0][12].text, 
     root[0][13].text, 
     root[0][14].text, 
     root[0][15].text, 
     root[0][16].text, 
     root[0][17].text, 
     root[0][18].text, 
     root[0][19].text, 
     root[0][20].text, 
     root[2].text, 
     root[1].text, 
     ]) 
    csvFile.close() 



for file in os.listdir('D:\\temp\\Export\\test'): 
    if file.endswith('.xml'): 
     path = os.path.join('D:\\temp\\Export\\test', file) 
     tree = ElementTree.parse(path) 
     #print(tree) 
     root = tree.getroot() 
     #print(root) 
     for item in root: 
      print(item) 
      writeData(item) 

Antwort

0

Der Grund, warum Sie nur die Daten der letzten XML-Datei zu sehen ist, dass Sie halten die Daten in der endgültigen CSV-Datei zu überschreiben. Statt die CSV-Datei für jede Iteration schreibt erneute Öffnen versuchen, es zu öffnen nur ein einziges Mal, und es zu einem writeData Funktion wie folgt übergeben:

def writeData(csv_writer, item): 
    csv_writer.writerow([ 
     'type', 
     'object', 
     'title', 
     'subject', 
     'domain', 
     'name', 
     '_name', 
     'version_label', 
     'creator_name', 
     'creation_date', 
     'modifier', 
     'modify_date', 
     'content_type', 
     'chronicle_id', 
     'antecedent_id', 
     'activity_date', 
     'search_from_date', 
     'number', 
     'service_code', 
     'initial_inspection_date', 
     'search_to_date', 
     'File Name', 
     'Location', 
     ]) 
    csv_writer.writerow([ 
     root[0][0].text, 
     root[0][1].text, 
     root[0][2].text, 
     root[0][3].text, 
     root[0][4].text, 
     root[0][5].text, 
     root[0][6].text, 
     root[0][7].text, 
     root[0][8].text, 
     root[0][9].text, 
     root[0][10].text, 
     root[0][11].text, 
     root[0][12].text, 
     root[0][13].text, 
     root[0][14].text, 
     root[0][15].text, 
     root[0][16].text, 
     root[0][17].text, 
     root[0][18].text, 
     root[0][19].text, 
     root[0][20].text, 
     root[2].text, 
     root[1].text, 
     ]) 

with open('D:\\metadata.csv', 'w', newline='') as csv_file: 

    csv_writer = csv.writer(csv_file, delimiter='|', lineterminator='\n') 
    for file in os.listdir('D:\\temp\\Export\\test'): 
     if file.endswith('.xml'): 
      path = os.path.join('D:\\temp\\Export\\test', file) 
      tree = ElementTree.parse(path) 
      root = tree.getroot() 
      writeData(csv_writer, root) 
+0

Danke, aber ... Erste Fehler Traceback (jüngste Aufforderung zuletzt): Die Datei "extractMetadata.py", Zeile 70, in writedata (csv_writer, item) file "extractMetadata.py", Zeile 11, in writedata csvWriter.writerow ([ Nameerror: name 'csvWriter' nicht – user1457821

+0

Woops definiert ist Mein Fehler, ich habe 'csvWriter' in' csv_writer' in letzter Minute umbenannt und anscheinend eine Variable vergessen. Ich habe meine Antwort bearbeitet. –

+0

Danke noch eine Änderung, die ich gemacht habe ... tatsächlich ly wir brauchen keine zweite schleife "für item in root:" seine duplizieren die daten. Weißt du, Kopfzeile nur einmal zu machen? – user1457821