【问题标题】:Python create XML from Csv within a loopPython 在循环中从 Csv 创建 XML
【发布时间】:2013-12-02 13:25:42
【问题描述】:

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

CSV:

CatOne, CatTwo, CatThree
ProdOne, ProdTwo, ProdThree
ProductOne, ProductTwo, ProductThree

所需的 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>

这是我的代码:

#! 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()
    details = csvData.next()
    details2 = csvData.next()
    root = etree.Element('root')

    prod = etree.SubElement(root,'prod')
    for index in range(0, len(header)):
        child = etree.SubElement(prod, header[index])
        child.text = details[index]
        prod.append(child)   
    prod = etree.SubElement(root,'prod')
    for index in range(0, len(header)):
        child = etree.SubElement(prod, header[index])
        child.text = details2[index]
        prod.append(child)      
    result = etree.tostring(root, pretty_print=True)
    xmlFile.write(result)  

if __name__ == '__main__':
    main()

我得到了想要的输出,但我这样做的方式真的很糟糕。 我想以某种通用的方式拥有它,我相信它可能更像pythonic 但我无法弄清楚如何做到这一点。 如果 csv 有 10 甚至 20 行,代码也应该可以工作。

感谢您的帮助

【问题讨论】:

    标签: python xml csv lxml


    【解决方案1】:

    好的,我找到了解决方法。

    我会在这里回答我自己的问题,我希望它可能对其他人有所帮助

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

    【讨论】:

    • 你可以用for cat, prod in zip(headers, row):代替for index in range ...
    • 感谢您添加此评论,我将看看如何处理 header[index] 然后因为我第一眼看不到如何更改它
    • cat == header[index]。见,how zip() works。我的意思是:for category, prod_text in zip(headers, row) 以避免与prod 发生冲突。
    • 您对 prod.append(child) 的调用最终会创建两个指向子元素的链接,并导致 XML 输出中出现重复的子元素。当您将子元素创建为子元素时,子元素已经链接到产品
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2020-09-16
    • 2018-04-05
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多