【问题标题】:Parse many XML files to one CSV file将多个 XML 文件解析为一个 CSV 文件
【发布时间】:2020-01-01 17:08:03
【问题描述】:

以下代码采用 XML 文件并将特定元素解析为 CSV 文件。关于代码我有更简单和不同的代码,但略有不同,下面的代码是来自这里的大量帮助的结果。

from xml.etree import ElementTree as ET
from collections import defaultdict
import csv

tree = ET.parse('thexmlfile.xml')
root = tree.getroot()

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)

    start_nodes = root.findall('.//START')
    headers = ['id', 'service_code', 'rational', 'qualify', 'description_num', 'description_txt', 'set_data_xin', 'set_data_xax', 'set_data_value', 'set_data_x']
    writer.writerow(headers)
    for sn in start_nodes:
        row = defaultdict(str)

        for k,v in sn.attrib.items():
            row[k] = v

        for rn in sn.findall('.//Rational'):
            row['rational'] = rn.text

        for qu in sn.findall('.//Qualify'):
            row['qualify'] = qu.text

        for ds in sn.findall('.//Description'):
            row['description_txt'] = ds.text
            row['description_num'] = ds.attrib['num']

        # all other tags except set data must be parsed before this.
        for st in sn.findall('.//SetData'):
            for k,v in st.attrib.items():
                row['set_data_'+ str(k)] = v
            row_data = [row[i] for i in headers]
            writer.writerow(row_data)
            row = defaultdict(str)

我试图让这段代码进入一个包含许多 XML 文件的文件夹,并将它们解析为一个 CSV 文件。简单地说,不是解析一个 XML 文件,而是对多个 XML 执行此操作,然后将它们解析为一个 csv 文件。

我通常会使用 os.listdir(): 。代码看起来像这样

directory = 'C:/Users/docs/FolderwithXMLs'
for filename in os.listdir(directory):
    if filename.endswith(".xml"):
        #Something here
        df.to_csv("./output.csv")
        continue
    else:
        continue

到目前为止,我已经尝试了不同的方法将其实现到上面的代码中,但没有成功。考虑到这个过程也应该很快。

【问题讨论】:

  • @abhilb;努力实现上面的功能,所以它遍历多个 xml 文件
  • 这里有什么问题?#
  • @abhilb,我希望您编写的代码不是只解析一个 XML 文件,而是使用许多 XML 文件来执行此操作并将它们解析为一个 CSV 文件

标签: python pandas elementtree


【解决方案1】:

试试:


from pathlib import Path

directory = 'C:/Users/docs/FolderwithXMLs'

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)

    headers = ['id', 'service_code', 'rational', 'qualify', 'description_num', 'description_txt', 'set_data_xin', 'set_data_xax', 'set_data_value', 'set_data_x']

    writer.writerow(headers)

    xml_files_list = list(map(str,Path(directory).glob('**/*.xml')))
    for xml_file in xml_files_list:
        tree = ET.parse(xml_file)
        root = tree.getroot()

        start_nodes = root.findall('.//START')
        for sn in start_nodes:
            row = defaultdict(str)

            # <<<<< Indentation was wrong here
            for k,v in sn.attrib.items():
                row[k] = v

            # Rest of the code here.

希望对您有所帮助。

【讨论】:

  • 这是完整代码controlc.com/586d041e。我尝试了两个相同的 xmls 文件,只是不同的数字相同的结构。这是输出的照片,它似乎只解析特定部分,侧面也是 xml ibb.co/rdSgykr
  • for 循环的缩进错误。现在修复了
猜你喜欢
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多