xml 文件到 csv 文件 python 脚本
xml file to csv file python script
我需要一个 python 脚本来从 xml 文件中提取数据
我有一个 xml 文件,如下所示:
<software>
<name>Update Image</name>
<Build>22.02</Build>
<description>Firmware for Delta-M Series </description>
<CommonImages> </CommonImages>
<ModelBasedImages>
<ULT>
<CNTRL_0>
<file type="UI_APP" ver="2.35" crc="1234"/>
<file type="MainFW" ver="5.01" crc="5678"/>
<SIZE300>
<file type="ParamTableDB" ver="1.1.4" crc="9101"/>
</SIZE300>
</CNTRL_0>
<CNTRL_2>
<file type="UI_APP" ver="2.35" crc="1234"/>
<file type="MainFW" ver="5.01" crc="9158"/>
</CNTRL_2>
</ULT>
</ModelBasedImages>
</software>
我想要 table 格式的数据,例如:
输入 ver crc
UI_APP 2.35 1234
主固件 5.01 5678
参数表数据库 1.1.4 9101
UI_APP 2.35 1234
主固件 5.01 9158
提取到任何类型的文件csv/doc.....
我试过这段代码:
import xml.etree.ElementTree as ET
import csv
tree = ET.parse("Build_40.01 (copy).xml")
root = tree.getroot()
# open a file for writing
Resident_data = open('ResidentData.csv', 'w')
# create the csv writer object
csvwriter = csv.writer(Resident_data)
resident_head = []
count = 0
for member in root.findall('file'):
resident = []
address_list = []
if count == 0:
name = member.find('type').tag
resident_head.append(name)
ver = member.find('ver').tag
resident_head.append(ver)
crc = member.find('crc').tag
resident_head.append(crc)
csvwriter.writerow(resident_head)
count = count + 1
name = member.find('type').text
resident.append(name)
ver = member.find('ver').text
resident.append(ver)
crc = member.find('crc').text
resident.append(crc)
csvwriter.writerow(resident)
Resident_data.close()
提前致谢
edited:xml 代码已更新。
使用 xpath expression .//file
to find all <file>
elements in the XML document, and then use each element's attributes to populate the CSV file through a csv.DictWriter
:
import csv
import xml.etree.ElementTree as ET
tree = ET.parse("Build_40.01 (copy).xml")
root = tree.getroot()
with open('ResidentData.csv', 'w') as f:
w = csv.DictWriter(f, fieldnames=('type', 'ver', 'crc'))
w.writerheader()
w.writerows(e.attrib for e in root.findall('.//file'))
对于您的示例输入,输出 CSV 文件将如下所示:
type,ver,crc
UI_APP,2.35,1234
MainFW,5.01,5678
ParamTableDB,1.1.4,9101
UI_APP,2.35,1234
MainFW,5.01,9158
它使用 CSV 文件的默认分隔符(逗号)。您可以使用 delimiter=' '
选项将分隔符更改为 DictWriter()
,但是,您将无法获得与示例输出相同的格式,它似乎使用固定宽度的字段(但您可能会逃脱使用制表符作为分隔符)。
我需要一个 python 脚本来从 xml 文件中提取数据
我有一个 xml 文件,如下所示:
<software>
<name>Update Image</name>
<Build>22.02</Build>
<description>Firmware for Delta-M Series </description>
<CommonImages> </CommonImages>
<ModelBasedImages>
<ULT>
<CNTRL_0>
<file type="UI_APP" ver="2.35" crc="1234"/>
<file type="MainFW" ver="5.01" crc="5678"/>
<SIZE300>
<file type="ParamTableDB" ver="1.1.4" crc="9101"/>
</SIZE300>
</CNTRL_0>
<CNTRL_2>
<file type="UI_APP" ver="2.35" crc="1234"/>
<file type="MainFW" ver="5.01" crc="9158"/>
</CNTRL_2>
</ULT>
</ModelBasedImages>
</software>
我想要 table 格式的数据,例如:
输入 ver crc
UI_APP 2.35 1234
主固件 5.01 5678
参数表数据库 1.1.4 9101
UI_APP 2.35 1234
主固件 5.01 9158
提取到任何类型的文件csv/doc.....
我试过这段代码:
import xml.etree.ElementTree as ET
import csv
tree = ET.parse("Build_40.01 (copy).xml")
root = tree.getroot()
# open a file for writing
Resident_data = open('ResidentData.csv', 'w')
# create the csv writer object
csvwriter = csv.writer(Resident_data)
resident_head = []
count = 0
for member in root.findall('file'):
resident = []
address_list = []
if count == 0:
name = member.find('type').tag
resident_head.append(name)
ver = member.find('ver').tag
resident_head.append(ver)
crc = member.find('crc').tag
resident_head.append(crc)
csvwriter.writerow(resident_head)
count = count + 1
name = member.find('type').text
resident.append(name)
ver = member.find('ver').text
resident.append(ver)
crc = member.find('crc').text
resident.append(crc)
csvwriter.writerow(resident)
Resident_data.close()
提前致谢 edited:xml 代码已更新。
使用 xpath expression .//file
to find all <file>
elements in the XML document, and then use each element's attributes to populate the CSV file through a csv.DictWriter
:
import csv
import xml.etree.ElementTree as ET
tree = ET.parse("Build_40.01 (copy).xml")
root = tree.getroot()
with open('ResidentData.csv', 'w') as f:
w = csv.DictWriter(f, fieldnames=('type', 'ver', 'crc'))
w.writerheader()
w.writerows(e.attrib for e in root.findall('.//file'))
对于您的示例输入,输出 CSV 文件将如下所示:
type,ver,crc UI_APP,2.35,1234 MainFW,5.01,5678 ParamTableDB,1.1.4,9101 UI_APP,2.35,1234 MainFW,5.01,9158
它使用 CSV 文件的默认分隔符(逗号)。您可以使用 delimiter=' '
选项将分隔符更改为 DictWriter()
,但是,您将无法获得与示例输出相同的格式,它似乎使用固定宽度的字段(但您可能会逃脱使用制表符作为分隔符)。