如何在不使用Etree或Xmltodict等库的情况下在Python中将XML转换为CSV?

wfveoks0  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(496)

xml文件如下:

<employee>
        <id>303</id>
        <name>varma</name>
        <age>20</age>
        <salary>120000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>304</id>
        <name>Cyril</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>305</id>
        <name>Yojith</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
</employees>

想要输出csv或表格格式而不使用任何库
我尝试过使用库,但没有任何库我无法做到这一点,有一个想法:1.将xml转换为字典2.将字典转换为csv

qhhrdooz

qhhrdooz1#

我建议只使用库,因为它们通常是非常优化的。我稍后再谈。现在,这里有一种利用xml.dom.minidom模块的方法,它是Python标准库的一部分,因此不需要额外的库。

编辑:使用标准CSV库重写了最后一部分,而不是手动写入文件,如评论所建议的那样。这使得2Python内置模块,而不是1。如果你感兴趣的话,写CSV的原始代码将在回复的末尾。

from xml.dom import minidom
from csv import DictWriter

# Step 1: Read and parse the XML file
# Write it as a string, or open the file and read it
xml_file = open('employees.xml', 'r')
xml_data = xml_file.read()

dom = minidom.parseString(xml_data)
employees = dom.getElementsByTagName('employee')

xml_file.close()

# Step 2: Extract the required information
data = []
for employee in employees:
    emp_data = {}
    for child in employee.childNodes:
        if child.nodeType == minidom.Node.ELEMENT_NODE:
            emp_data[child.tagName] = child.firstChild.data
    data.append(emp_data)

# Step 3: Write the extracted information to a CSV file
with open('output.csv', 'w', newline = '') as csv_file:
    fieldnames = ['id', 'name', 'age', 'salary', 'division']
    writer = DictWriter(csv_file, fieldnames = fieldnames)

    writer.writeheader()
    for emp_data in data:
        writer.writerow(emp_data)

不要重新发明轮子,只要重新调整就行了。

  • 我想是安东尼·J·德安吉洛
    我建议不要使用这个代码。你真的应该使用lxml。它非常简单易用,可以处理具有嵌套元素和属性的复杂XML结构。让我知道一切进展如何!
原始CSV写代码,不带CSV库
# Step 3: Write the extracted information to a CSV file
with open('output.csv', 'w') as f:
    f.write('id,name,age,salary,division\n')
    for emp_data in data:
        f.write(f"{emp_data['id']},{emp_data['name']},{emp_data['age']},{emp_data['salary']},{emp_data['division']}\n")

相关问题