2016-07-25 10 views
0

Ich habe eine CSV und möchte eine XML-Datei basierend auf jeder Zeile in der CSV generieren. Derzeit erstellt es eine XML-Datei, aber nur mit der letzten Zeile in der CSV. Wie kann ich dieses Skript ändern, um eine XML-Datei für jede Zeile zu generieren. Und idealerweise haben der Dateiname basierend auf der Spalte: "File/Entity Name". Siehe unten für das, was ich gerade habe, Danke!Generieren von XML-Dateien basierend auf Zeilen in CSV

# CSV module 
import csv 
# Stuff from the XML module 
from xml.etree.ElementTree import Element, SubElement, tostring, ElementTree 
import xml.etree.ElementTree as etree 


# Topmost XML element 
root = Element('root') 
number = Element('number') 
# Open a file 
with open(r'U:\PROJECTS\Technical Graphics\book1.csv') as f: 

    for row in csv.DictReader(f): 
     root = Element('gmd:MD_Metadata') 
     tree = ElementTree(root) 
     for k, v in row.items(): 
      child = SubElement(root, k) 
      child.text = v 
      reader = csv.DictReader(f) 

    tree.write(open(r'U:\PROJECTS\Technical Graphics\test.xml','w')) 
    print tostring(root) 

Antwort

0

Sie legen den Wert der Wurzel hier:

for row in csv.DictReader(f): 
    root = Element('gmd:MD_Metadata') 
    tree = ElementTree(root) 
    filename = row.items()[7] # where 7 is the column your interested in 
    for k, v in row.items(): 
     child = SubElement(root, k) 
     child.text = v 
     reader = csv.DictReader(f) 
     tree.write(open(r'U:\PROJECTS\Technical Graphics\' + filename + '.xml','w')) 
     print tostring(root) 
0

Sie nur einmal die csv.DictReader() Klasse erstellen möchten, anstatt für jede Iteration der Schleife.

Ebenso möchten Sie nur Ihr XML-Element root einmal erstellen.

Schließlich ist die Reihenfolge der Elemente, die von row.items() zurückgegeben werden, willkürlich und spiegelt nicht die Reihenfolge der Felder in der Datei wider.

Versuchen Sie folgendes:

# CSV module 
import csv 
# Stuff from the XML module 
from xml.etree.ElementTree import Element, SubElement, tostring, ElementTree 
import xml.etree.ElementTree as etree 


# Topmost XML element 
root = Element('root') 
number = Element('number') 
# Open a file 
with open(r'U:\PROJECTS\Technical Graphics\book1.csv') as f: 

    root = Element('gmd:MD_Metadata') 
    tree = ElementTree(root) 
    reader = csv.DictReader(f) 
    for row in reader: 
     xml_row = SubElement(root, "row") 
     for k in reader.fieldnames: 
      child = SubElement(xml_row, k) 
      child.text = row[k] 

    tree.write(open(r'U:\PROJECTS\Technical Graphics\test.xml','w')) 
    print tostring(root) 
Verwandte Themen