python - 如何在python中将xml文件转换为csv输出?
问题描述
我有一个从我无法控制的数据库中提取的基本 XML 文件。
<?xml version="1.0" encoding="utf-8"?>
<data>
<Job1Start><Time>20200202055415725</Time></Job1Start>
<Job1End><Time>20200202055423951</Time></Job1End>
<Job2Start><Time>20200202055810390</Time></Job2Start>
<Job3Start><Time>20200202055814687</Time></Job3Start>
<Job2End><Time>20200202055819000</Time></Job2End>
<Job3End><Time>20200202055816708</Time></Job3End>
</data>
我希望在 CSV 文件中获得以下输出:
Task Start Finish
Job1 20200202055415725 20200202055423951
Job2 20200202055810390 20200202055819000
Job3 20200202055814687 20200202055816708
我尝试了一些方法,下面似乎是我得到的最接近正确输出的方法,但即使这样也不能正常工作:
import xml.etree.ElementTree as ET
import csv
tree = ET.parse('Jobs.xml')
root = tree.getroot()
with open('Output.csv', 'w') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for TaskName in root.findall('Job1Start'):
starttime = TaskName.find('Time').text
task = "Job1"
writer.writerows(zip(task, starttime))
print("Job1", starttime)
我从中得到的输出如下所示。它的格式不正确,我只能在 Job1 上搜索开始时间:
有人有类似问题的经验吗?
解决方案
writerows
而不是writerow
导致单字符问题和csv.writer
. writerows
需要一个列表列表(或更准确地说是一个可迭代的可迭代对象)并且字符串是可迭代的,因此字符串列表满足要求,但内部“列表”项是单个字符。
csv.writer
还需要newline=''
每个文档,并且在 Windows 上,当在 Excel 中打开 CSV 时,缺少此参数会显示为行之间的额外空白行。
这是一个解决方案:
import xml.etree.ElementTree as ET
import csv
tree = ET.parse('Jobs.xml')
root = tree.getroot()
# Use newline='' per csv docs. This fixes the blanks lines in your output
with open('Output.csv', 'w', newline='') as csv_file:
writer = csv.writer(csv_file)
writer.writerow('Task Start Finish'.split())
for job in range(1,4):
start = root.find(f'Job{job}Start/Time').text
end = root.find(f'Job{job}End/Time').text
# Use writerow not writerows...latter expects list of lists.
writer.writerow([f'Job{job}',start,end])
输出:
Task,Start,Finish
Job1,20200202055415725,20200202055423951
Job2,20200202055810390,20200202055819000
Job3,20200202055814687,20200202055816708
推荐阅读
- c# - 如何修复在 asp.net 中找不到此 localhost 页面
- javascript - 如果状态禁用,则禁用按钮
- javascript - 如何比较对象中的数组,如果在某个位置所有数组的值为真,则返回它们的索引
- r - 如何使用反应函数更改 rshiny 中的列名
- python - 2 python.exe如何处理
- python-3.x - python 模块已安装但未在 IDLE 3.8 中打开
- ios - 设置 backIndicatorImage 后,如何复用系统的后退图标?
- ios - AVAssetExportSession 导出的视频的视频和音频不同步
- sql - 复制表中的条目更改一个字段
- java - 身份验证失败时,弹簧过滤器链停止