Python在循环中从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

我正在尝试从csv创建一个xml文件

CSV:

所需的XML:

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