Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 处理文件夹中的多个xml_Python 3.x_Xml Parsing - Fatal编程技术网

Python 3.x 处理文件夹中的多个xml

Python 3.x 处理文件夹中的多个xml,python-3.x,xml-parsing,Python 3.x,Xml Parsing,我有几个结构相同的XML文件。我想从这些XML文件中读出一些数据 我写了一个脚本,在一个文件中做得很好。然后我尝试扩展我的脚本,以便它处理一个文件夹中的所有文件。我检查了几个类似的问题,并试图将其用于我的脚本,但我就是无法使其工作。我总是只处理第一个文件 这是我的密码: import xml.etree.ElementTree as ET import csv import glob filenames = glob.glob('XML/*.xml') for filename in fil

我有几个结构相同的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
将xml.etree.ElementTree作为ET导入
导入csv
导入glob
filenames=glob.glob('XML/*.XML')
对于文件名中的文件名:
以open(filename,'r')作为内容:
tree=ET.parse(内容)
root=tree.getroot()
报告\数据=打开('Report.csv','w')
使用报告数据:
csvwriter=csv.writer(报告数据)
报告头=[]
报告头追加('DocumentId')
报告头追加('AgreementId')
报告头追加(‘类别’)
报告头追加('Doctype')
csvwriter.writerow(报告头)
max=len(根[4])
i=0
而我

如果打开report.csv,则只有来自第一个XML的数据存在。所有附加文件都被忽略。你知道我该怎么解决吗?任何帮助都将不胜感激。

您在每个文件之后覆盖结果,因此所有文件都将被处理,只存储最后一个文件

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

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

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


应该修复它。

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

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

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

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


应该会解决的。

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

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
将xml.etree.ElementTree作为ET导入
导入csv
导入glob
filenames=glob.glob('*.xml')
打印(文件名)
报告\数据=打开('Report.csv','w')
使用报告数据:
csvwriter=csv.writer(报告数据)
报告头=[]
报告头追加('DocumentId')
报告头追加('AgreementId')
报告头追加(‘类别’)
报告头追加('Doctype')
csvwriter.writerow(报告头)
对于文件名中的f:
以开放式(f,'r')作为内容:
tree=ET.parse(内容)
root=tree.getroot()
打印(内容)
报告\数据=打开('Report.csv','a')
max=len(根[4])
i=0
而我
我能够解决我的问题。最后,我的代码如下所示:

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
将xml.etree.ElementTree作为ET导入
导入csv
导入glob
filenames=glob.glob('*.xml')
打印(文件名)
报告\数据=打开('Report.csv','w')
使用报告数据:
csvwriter=csv.writer(报告数据)
报告头=[]
报告头追加('DocumentId')
报告头追加('AgreementId')
报告头追加(‘类别’)
报告头追加('Doctype')
csvwriter.writerow(报告头)
对于文件名中的f:
以开放式(f,'r')作为内容:
tree=ET.parse(内容)
root=tree.getroot()
打印(内容)
报告\数据=打开('Report.csv','a')
max=len(根[4])
i=0
而我
您能否修复缩进,使每个级别的空格数保持一致?你混合了4格缩进和单格缩进。哦,您的
Report\u data=open('Report.csv','w')
和相应的csv设置应该在文件名中文件名的
之前:
循环。欢迎使用Stackoverflow!你解释得很好。现在,为了让你的问题更完美,在最后用一句话把它说清楚,比如:“我怎样才能完成这件事?”。你会有更多的机会得到答案。谢谢你的提示。我相应地编辑了最后一部分。你能修正你的缩进,使每个级别有一致的空格数吗?你混合了4格缩进和单格缩进。哦,您的
Report\u data=open('Report.csv','w')
和相应的csv设置应该在文件名中文件名的
之前:
循环。欢迎使用Stackoverflow!你解释得很好。现在,为了让你的问题更完美,在最后用一句话把它说清楚,比如:“我怎样才能完成这件事?”。你会有更多的机会得到答案。谢谢你的提示。我相应地编辑了最后一部分。非常感谢你的建议。我更改了它,但现在我收到以下错误消息:ValueError:关闭文件上的I/O操作。您知道我必须更改什么才能使其正常工作吗?非常感谢您的建议。我更改了它,但现在我收到以下错误消息:ValueError:I/O操作关闭的文件。你知道我必须更改什么吗