使用Python将不常见的XML文件转换为CSV

1sbrub3j  于 2023-01-15  发布在  Python
关注(0)|答案(4)|浏览(120)

我的XML文件遇到问题。我希望实现与中相同的问题:https://www.delftstack.com/howto/python/xml-to-csv-python/
但是,我的XML文件看起来有点不同,例如:

<students>
<student name="Rick Grimes" rollnumber="1" age="15"/>
<student name="Lori Grimes" rollnumber="2" age="16"/>
<student name="Judith Grimes" rollnumber="4" age="13"/>
</students>

链接中指定的代码不适用于此格式。

from xml.etree import ElementTree

tree = ElementTree.parse("input.xml")
root = tree.getroot()

for student in root:
    name = student.find("name").text
    roll_number = student.find("rollnumber").text
    age = student.find("age").text
    print(f"{name},{roll_number},{age}")

我有很少的编码经验,所以希望有人在这里可以帮助我。
预期结果:
里克·格里姆斯,1,15洛里·格里姆斯,2,16卡尔·格里姆斯,3,14朱迪思·格里姆斯,4,13
实际结果:
属性错误:"NoneType"对象没有属性"text"

dkqlctbz

dkqlctbz1#

text指的是标签的实际文本。

<student> text here </student>

由于您的标签正在自动关闭,因此您没有任何标签。您要查找的是标签属性attrib:医生在这里
像这样的东西应该可以帮助你得到你正在寻找的:

for student in root:
    print(student.attrib)
esyap4oy

esyap4oy2#

如果没有任何文本可供获取,则无法获取文本,而是希望使用.attrib[key],因为您将值作为属性。
我已经修改了您的示例,以便它可以使用您的XML文件。

from xml.etree import ElementTree

tree = ElementTree.parse("input.xml")
root = tree.getroot()

for student in root:
    name = student.attrib["name"]
    roll_number = student.attrib["rollnumber"]
    age = student.attrib["age"]
    print(f"{name},{roll_number},{age}")

希望这对你有帮助。

mzillmmw

mzillmmw3#

import io
from xml.etree import ElementTree

xml_string = """<students>
        <student name="Rick Grimes" rollnumber="1" age="15"/>
        <student name="Lori Grimes" rollnumber="2" age="16"/>
        <student name="Judith Grimes" rollnumber="4" age="13"/>
        </students>"""

file = io.StringIO(xml_string)
tree = ElementTree.parse(file)
root = tree.getroot()

result = ""
for student in root:
    result += f"{student.attrib['name']},{student.attrib['rollnumber']},{student.attrib['age']} "
print(result)

结果

Rick Grimes,1,15 Lori Grimes,2,16 Judith Grimes,4,13
eni9jsuy

eni9jsuy4#

对于这样简单的结构化XML,您还可以使用panda的内置函数,代码分为两行:

import pandas as pd

df = pd.read_xml('caroline.xml', xpath='.//student')
csv = df.to_csv('caroline.csv', index=False)

# For visualization only
with open('caroline.csv', 'r') as f:
    lines = f.readlines()

for line in lines:
    print(line)

输出:

name,rollnumber,age
Rick Grimes,1,15
Lori Grimes,2,16
Judith Grimes,4,13

使用选项header=False,您还可以关闭以将头文件写入csv文件。

相关问题