2016-07-25 49 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)