Python在循环中从Csv创建XML
我正在尝试从csv创建一个xml文件 CSV: 所需的XML:Python在循环中从Csv创建XML,python,xml,csv,lxml,Python,Xml,Csv,Lxml,我正在尝试从csv创建一个xml文件 CSV: 所需的XML: <root> <prod> <CatOne>ProdOne</CatOne> <CatTwo>ProdTwo</CatTwo> <CatThree>ProdThree</CatThree> </prod> <prod> <CatOne>ProductOne&l
<root>
<prod>
<CatOne>ProdOne</CatOne>
<CatTwo>ProdTwo</CatTwo>
<CatThree>ProdThree</CatThree>
</prod>
<prod>
<CatOne>ProductOne</CatOne>
<CatTwo>ProductTwo</CatTwo>
<CatThree>ProductThree</CatThree>
</prod>
</root>
我得到了期望的输出,但我的方式真的很糟糕。
我想用一种通用的方式,我相信它可能更像蟒蛇
但我不知道怎么做。
如果csv有10行甚至20行,代码也应该可以工作
谢谢你的帮助好的,我找到了解决方法 我会在这里回答我自己的问题,我希望它能帮助其他人
#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree
def main():
csvFile = 'test.csv'
xmlFile = open('myData.xml', 'w')
csvData = csv.reader(open(csvFile), delimiter='\t')
header = csvData.next()
counter = 0
root = etree.Element('root')
for row in csvData:
prod = etree.SubElement(root,'prod')
for index in range(0, len(header)):
child = etree.SubElement(prod, header[index])
child.text = row[index].decode('utf-8')
prod.append(child
result = etree.tostring(root, pretty_print=True)
xmlFile.write(result)
if __name__ == '__main__':
main()
好的,我找到了解决方法 我会在这里回答我自己的问题,我希望它能帮助其他人
#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree
def main():
csvFile = 'test.csv'
xmlFile = open('myData.xml', 'w')
csvData = csv.reader(open(csvFile), delimiter='\t')
header = csvData.next()
counter = 0
root = etree.Element('root')
for row in csvData:
prod = etree.SubElement(root,'prod')
for index in range(0, len(header)):
child = etree.SubElement(prod, header[index])
child.text = row[index].decode('utf-8')
prod.append(child
result = etree.tostring(root, pretty_print=True)
xmlFile.write(result)
if __name__ == '__main__':
main()
您可以使用
作为cat,prod-in-zip(headers,row):
而不是作为范围内的索引…
。感谢您添加此评论,我将看看如何处理header[index],因为乍一看,我看不到如何更改cat==header[index]
。看见我的意思是:对于category,在zip(headers,row)
中生成文本,以避免与prod
冲突。您对prod.append(child)的调用最终会创建指向子元素的两个链接,并在XML输出中生成重复的子元素。Child已链接到prod,因为您已将其创建为子元素。您可以使用作为cat,prod in-zip(headers,row):
而不是作为范围内的索引…
。感谢您添加此注释,我将查看如何处理header[index],因为我一眼就看不到如何更改cat==header[index]
。请参见,。我的意思是:对于类别,在zip(标题,行)中生成文本
,以避免与prod
冲突。您对prod.append(child)的调用最终会创建指向该子元素的两个链接,并在XML输出中产生重复的子元素。当您将其作为子元素创建时,该子元素已经链接到prod
#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree
def main():
csvFile = 'test.csv'
xmlFile = open('myData.xml', 'w')
csvData = csv.reader(open(csvFile), delimiter='\t')
header = csvData.next()
counter = 0
root = etree.Element('root')
for row in csvData:
prod = etree.SubElement(root,'prod')
for index in range(0, len(header)):
child = etree.SubElement(prod, header[index])
child.text = row[index].decode('utf-8')
prod.append(child
result = etree.tostring(root, pretty_print=True)
xmlFile.write(result)
if __name__ == '__main__':
main()