Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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 如何将多个XML文件解析为多个CSV文件?_Python_Xml_Pandas_Csv_Elementtree - Fatal编程技术网

Python 如何将多个XML文件解析为多个CSV文件?

Python 如何将多个XML文件解析为多个CSV文件?,python,xml,pandas,csv,elementtree,Python,Xml,Pandas,Csv,Elementtree,我使用这段代码解析了XML文件,该代码适用于单个XML输入到单个csv输出。我尝试使用glob处理几个输入和几个csv输出,但我知道这是不正确的 导入全局 将xml.etree.ElementTree作为et导入 导入csv 对于glob.glob('./*.xml')中的文件: 打开(文件)为f时: tree=et.parse(f) nodes=tree.getroot() 打开(f'{f[:-4]}编辑的.csv',w')作为ff: cols=['dateTime','x','y','z',

我使用这段代码解析了XML文件,该代码适用于单个XML输入到单个csv输出。我尝试使用glob处理几个输入和几个csv输出,但我知道这是不正确的

导入全局
将xml.etree.ElementTree作为et导入
导入csv
对于glob.glob('./*.xml')中的文件:
打开(文件)为f时:
tree=et.parse(f)
nodes=tree.getroot()
打开(f'{f[:-4]}编辑的.csv',w')作为ff:
cols=['dateTime','x','y','z','motion','isMoving','stepCount','groupAreaId','commit']
nodewriter=csv.writer(ff)
nodewriter.writerow(cols)
对于节点中的节点:
values=[node.attrib.get(kk',)表示cols中的kk]
nodewriter.writerow(值)

如何更改以获得多个csv输出?

您可以创建一个文件名列表,然后在其中写入xml文件。如果输出文件已在目录中,则使用glob可以获取名称。如果文件不存在,下面的代码将使用给定的文件名创建

csvFileNames = ['outputfile1.csv', 'outputfile2.csv']
for file in csvFileNames:
    with open(file, 'w') as f:
        wtr = csv.writer(f)
        wtr.writerows( [[1, 2], [2, 3], [4, 5]]) # write what you want
要从目录中获取XML文件名,可以尝试以下代码:

from os import listdir
filenames = listdir('.') # here dot is used because script and csv files are in the same directory, if XML files are in other directory then set the path inside listdir
xmlFileNames = [ filename for filename in filenames if filename.endswith( ".xml" ) ]

# get xml file names like this, xmlFileNames = ["abc.xml", "ef.xml"]
resultCsvFileNameList = [fname.replace(".xml", ".csv") for fname in xmlFileNames ]

您的代码当前正在使用文件句柄来形成输出文件名。使用
file
代替
f
,如下所示:

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

for file in glob.glob('./*.xml'):
    with open(file) as f:
        tree = et.parse(f)
        nodes = tree.getroot()

        with open(f'{file[:-4]}edited.csv', 'w') as ff:
            cols = ['dateTime','x','y','z','motion','isMoving','stepCount','groupAreaId','commit']
            nodewriter = csv.writer(ff)
            nodewriter.writerow(cols)
            for node in nodes:
                values = [ node.attrib.get(kk, '') for kk in cols]
                nodewriter.writerow(values)

但是如果我有数千个csv文件要写,有什么比一个接一个地提到csv文件名更简单的吗?你不必手动编写文件名,使用glob你可以收集文件名谢谢编辑,但我的问题是我需要从xml文件创建.csv文件,显然csv文件还不存在。这就是为什么我想知道如何自动创建与xml具有相同文件名的.csv文件。您是否打算将打开(f'{file[:-4]}编辑的.csv',w')作为ff:?当前您正在使用文件名的文件句柄。得到您的答案!