Python 解析所有XML文件并将其转换为一个CSV文件

Python 解析所有XML文件并将其转换为一个CSV文件,python,xml,csv,parsing,Python,Xml,Csv,Parsing,我试图编写一个代码,搜索目录中的所有XML文件,然后解析这些XML并将一些数据保存到CSV文件中。我在那个目录中有50多个XML文件。每当我运行代码时,都会创建一个CSV文件,但它只打印最后一个xml文件的数据。如何将所有XML文件的数据打印到CSV文件?请帮助 这是我的密码: from xml.dom.minidom import parse import csv import os def writeToCSV(frelation): csvfile = open('data.cs

我试图编写一个代码,搜索目录中的所有XML文件,然后解析这些XML并将一些数据保存到CSV文件中。我在那个目录中有50多个XML文件。每当我运行代码时,都会创建一个CSV文件,但它只打印最后一个xml文件的数据。如何将所有XML文件的数据打印到CSV文件?请帮助 这是我的密码:

from xml.dom.minidom import parse
import csv
import os

def writeToCSV(frelation):
    csvfile = open('data.csv', 'w')
    fieldnames = ['sub', 'sup']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    relation = frelation.getElementsByTagName("predicate")
    for elem in relation:
        sub = elem.attributes['sub'].value
        for elem1 in elem.getElementsByTagName("sup"):
            sup = elem1.attributes['name'].value
            writer.writerow({'sub': sub, 'sup': sup})


for root, dirs, files in os.walk('data/frames'):
    for file in files:
        if (file.endswith('.xml')):
            xmldoc = parse(os.path.join(root, file))
            frelation = xmldoc.getElementsByTagName("frameset")[0]
            relation = frelation.getElementsByTagName("predicate")
            writeToCSV(frelation)

U在WriteToCSV中一次又一次地覆盖同一文件,可能会有如下小变化:

def writeToCSV(frelation,file_id):
    csvfile = open('data'+str(file_id)+'.csv', 'w')
    fieldnames = ['sub', 'sup']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    relation = frelation.getElementsByTagName("predicate")
    for elem in relation:
        sub = elem.attributes['sub'].value
        for elem1 in elem.getElementsByTagName("sup"):
            sup = elem1.attributes['name'].value
            writer.writerow({'sub': sub, 'sup': sup})

file_id=1;
for root, dirs, files in os.walk('data/frames'):
    for file in files:
        if (file.endswith('.xml')):
            xmldoc = parse(os.path.join(root, file))
            frelation = xmldoc.getElementsByTagName("frameset")[0]
            relation = frelation.getElementsByTagName("predicate")
            writeToCSV(frelation,file_id)
            file_id+=1
如果您只需要一个CSV文件,则需要以附加模式打开该文件,如果不存在,则+模式表示创建文件:

def writeToCSV(frelation):
        csvfile = open('data.csv', 'a+')
        fieldnames = ['sub', 'sup']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        relation = frelation.getElementsByTagName("predicate")
        for elem in relation:
            sub = elem.attributes['sub'].value
            for elem1 in elem.getElementsByTagName("sup"):
                sup = elem1.attributes['name'].value
                writer.writerow({'sub': sub, 'sup': sup})

其他代码中不需要更改

U在WriteToCSV中一次又一次地覆盖同一文件,可能会有如下小变化:

def writeToCSV(frelation,file_id):
    csvfile = open('data'+str(file_id)+'.csv', 'w')
    fieldnames = ['sub', 'sup']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    relation = frelation.getElementsByTagName("predicate")
    for elem in relation:
        sub = elem.attributes['sub'].value
        for elem1 in elem.getElementsByTagName("sup"):
            sup = elem1.attributes['name'].value
            writer.writerow({'sub': sub, 'sup': sup})

file_id=1;
for root, dirs, files in os.walk('data/frames'):
    for file in files:
        if (file.endswith('.xml')):
            xmldoc = parse(os.path.join(root, file))
            frelation = xmldoc.getElementsByTagName("frameset")[0]
            relation = frelation.getElementsByTagName("predicate")
            writeToCSV(frelation,file_id)
            file_id+=1
如果您只需要一个CSV文件,则需要以附加模式打开该文件,如果不存在,则+模式表示创建文件:

def writeToCSV(frelation):
        csvfile = open('data.csv', 'a+')
        fieldnames = ['sub', 'sup']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        relation = frelation.getElementsByTagName("predicate")
        for elem in relation:
            sub = elem.attributes['sub'].value
            for elem1 in elem.getElementsByTagName("sup"):
                sup = elem1.attributes['name'].value
                writer.writerow({'sub': sub, 'sup': sup})

其他代码中不需要更改

非常感谢你@雷汉·阿泽特非常感谢你@雷汉·艾泽尔