2016-07-25 31 views
0

我有一個CSV並且想要基於CSV中的每一行生成一個XML文件。 現在它會創建一個XML文件,但只能使用CSV中最後一行的。我如何修改這個腳本來爲每一行生成一個XML文件。理想情況下有的文件名基於列:「文件/實體名稱」。請參閱下面的內容,瞭解我目前擁有的功能基於CSV中的行生成XML文件

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

回答

0

您在此處設置根值:

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

你只需要創建一次csv.DictReader()類,而不是爲你的每次循環。

同樣,您只想創建一次您的root XML元素。

最後,從row.items()返回的項目的順序是任意的,並且不反映文件中字段的順序。

試試這個:

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