【问题标题】:Process multiple xml from a folder处理文件夹中的多个 xml
【发布时间】:2020-01-13 05:18:13
【问题描述】:

我有几个结构相同的 XML 文件。我想从这些 XML 文件中读出一些数据。

我写了一个脚本,它对一个文件做得很好。然后我尝试扩展我的脚本,以便它处理一个文件夹中的所有文件。我检查了几个类似的问题并尝试将其用于我的脚本,但我就是无法让它工作。我总是只处理第一个文件。

这是我的代码:

import xml.etree.ElementTree as ET
import csv
import glob

filenames = glob.glob('XML/*.xml')

for filename in filenames:

    with open(filename, 'r') as content:

        tree = ET.parse(content)
        root = tree.getroot()

        Report_data = open('report.csv', 'w')

        with Report_data:
            csvwriter = csv.writer(Report_data)
            report_head = []
            report_head.append('DocumentId')
            report_head.append('AgreementId')
            report_head.append('Category')
            report_head.append('Doctype')
            csvwriter.writerow(report_head)

           max = len(root[4])
           i = 0

           while i < max:
               report = []
               docid = root[4][i][0].text
               report.append(docid)
               agreementId = root[4][i][3][0][1].text
               report.append(agreementId)
               category = root[4][i][3][2][1].text
               report.append(category)
               docType = root[4][i][3][6][1].text
               report.append(docType)
               csvwriter.writerow(report)
               i = i + 1

如果我打开 report.csv,那里只有第一个 XML 中的数据。所有其他文件都将被忽略。知道我该如何解决吗?任何帮助将不胜感激。

【问题讨论】:

  • 你能修正你的缩进,使每个级别的空格数一致吗?您正在混合使用 4 空格缩进和单空格缩进。哦,你的 Report_data = open('report.csv', 'w') 和相应的 csv 设置应该在你的 for filename in filenames: 循环之前。
  • 欢迎来到 Stackoverflow!你很好地解释了你做了什么。现在,为了使您的问题完美,请在最后声明清楚,例如:“我怎样才能完成这项工作?”。您将有更多机会得到答案。
  • 感谢您的提示。我相应地编辑了最后一部分。

标签: python-3.x xml-parsing


【解决方案1】:

你在每个文件之后覆盖结果,所以所有文件都被处理,只存储最后一个

Report_data = open('report.csv', 'w')
for filename in filenames:

    with open(filename, 'r') as content:

        tree = ET.parse(content)
        root = tree.getroot()

应该修复它。

【讨论】:

  • 非常感谢您的建议。我更改了它,但现在我收到以下错误消息:ValueError: I/O operation on closed file.
  • 你知道我必须改变什么才能让它工作吗?
【解决方案2】:

我能够解决我的问题。最后,我的代码如下所示:

import xml.etree.ElementTree as ET
import csv
import glob

filenames = glob.glob('*.xml')

print(filenames)


Report_data = open('report.csv', 'w')

with Report_data:
    csvwriter = csv.writer(Report_data)
    report_head = []
    report_head.append('DocumentId')
    report_head.append('AgreementId')
    report_head.append('Category')
    report_head.append('Doctype')
    csvwriter.writerow(report_head)

for f in filenames:

    with open(f, 'r') as content:

        tree = ET.parse(content)
        root = tree.getroot()

        print(content)
        Report_data = open('report.csv', 'a')

        max = len(root[4])
        i = 0

        while i < max:
            csvwriter = csv.writer(Report_data)
            report = []
            docid = root[4][i][0].text
            report.append(docid)
            agreementId = root[4][i][3][0][1].text
            report.append(agreementId)
            category = root[4][i][3][2][1].text
            report.append(category)
            docType = root[4][i][3][6][1].text
            report.append(docType)
            csvwriter.writerow(report)
            i = i + 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多