【问题标题】:Python: Input data from .XML to .CSV filePython:将数据从 .XML 输入到 .CSV 文件
【发布时间】:2019-06-21 17:46:52
【问题描述】:

我正在尝试解析下面代码中包含的“XML”文件,但对所有定义的变量都报错:

NameError: 名称“computer_name”未定义

这是“XML”文件的摘录(因为它不是真正的 xml 文件,所以我试图将变量设置为找到的行下方的行):

        <p1:field>
        <p1:name>NewComputerName</p1:name>
        <p1:value>Computer01</p1:value>
        </p1:field>
        <p1:field>
        <p1:name>NewComputerAssetTag</p1:name>
        <p1:value>12345</p1:value>
        </p1:field>
        <p1:field>
        <p1:name>AcquisitionDate</p1:name>
        <p1:value>4/20/69</p1:value>
        </p1:field>

这是我的代码:

import csv
import os

with open('csvtest.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)
    writer.writerow(('Computer Name', 'Acquisition Date', 'Asset Tag'))
    for filename in os.listdir('\\\\windb\\f$\\Technology\\V1\\0'):
        if filename.endswith(".xml"):
            with open(os.path.join('\\\\windb\\f$\\Technology\\V1\\0',filename), "r") as input:
                for line in input:
                    if line.startswith('    <p1:name>NewComputerName</p1:name>'):
                            computer_name=next(input, '').strip()
                            computer_name=computer_name.split("<p1:value>")[1].split("</")[0]
                    elif line.startswith('    <p1:name>AcquisitionDate'):
                            acqDate=next(input, '').strip()
                            acqDate=acqDate.split("<p1:value>")[1].split("</")[0]
                    elif line.startswith('    <p1:name>NewComputerAssetTag'):
                            assTag=next(input, '').strip()
                            assTag=assTag.split("<p1:value>")[1].split("</")[0]
                myData = [computer_name,acqDate,assTag]
                writer.writerow(myData)

我希望这会将 3 个变量写入 CSV 文件,为目录中的每个 XML 文件附加一行。

输出为 NameError: name 'computer_name' is not defined

【问题讨论】:

    标签: python xml-parsing python-import export-to-csv elementtree


    【解决方案1】:

    不要手动解析 XML 文件,使用为它制作的库,例如美丽汤:

    data = '''<p1:field>
            <p1:name>NewComputerName</p1:name>
            <p1:value>Computer01</p1:value>
            </p1:field>
            <p1:field>
            <p1:name>NewComputerAssetTag</p1:name>
            <p1:value>12345</p1:value>
            </p1:field>
            <p1:field>
            <p1:name>AcquisitionDate</p1:name>
            <p1:value>4/20/69</p1:value>
            </p1:field>'''
    
    from bs4 import BeautifulSoup
    import csv
    
    soup = BeautifulSoup(data, 'lxml')
    fields = soup.find_all('p1:value')
    
    with open('csvtest.csv', 'w', newline='') as outfile:
        writer = csv.writer(outfile)
        writer.writerow(('Computer Name', 'Acquisition Date', 'Asset Tag'))
    
        for n, a, d in zip(fields[::3], fields[1::3], fields[2::3]):
            writer.writerow([n.text, d.text, a.text])
    

    csvtest.csv 的内容为:

    Computer Name,Acquisition Date,Asset Tag
    Computer01,4/20/69,12345
    

    【讨论】:

    • 嗨 Andrej - 这很好用,但作为初学者,我在概念化数据变量的迭代时遇到了麻烦。我想浏览整个 xml 文件目录,从每个文件中提取字段,并将它们作为新行附加到 csv 中。
    • @pythondewd69 所有的“魔法”都是通过 python 切片完成的。解释一下:我们知道每个项目都有 3 个&lt;p1:value /&gt; 标签,所以我们想将 3 个值中的每一个“绑定”到一个项目。要了解更多 Python 切片的工作原理,请参阅此处stackoverflow.com/questions/509211/understanding-slice-notation
    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多