【问题标题】:Python - Converting XML to CSVPython - 将 XML 转换为 CSV
【发布时间】:2017-05-17 05:48:02
【问题描述】:

大家下午好。

我会先说这是我第一次涉足 Python。我正在使用 API 返回以下 XML 示例:

<Times>
    <Time>
        <ID> 120877787 </ID>
        <Job>
            <ID> J000050 </ID>
            <Name> My Job </Name>
        </Job>
        <Task>
            <ID> 59469972 </ID>
            <Name> My Task </Name>
        </Task>
        <Staff>
            <ID> 74268 </ID>
            <Name> My Name </Name>
        </Staff>
        <Date> 2017-05-19T00:00:00 </Date>
        <Minutes> 480 </Minutes>
        <Note/>
        <Billable> true </Billable>
    </Time>
</Times>

我目前正在使用 Python 3.4 将 XML 转换为 CSV。

我已经做了很多研究(例如http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-xml-to-csv-using-python/)来解决这个问题,但我无法得出一个合适的结果,主要是因为我对语法的理解不够好,无法适应它我的具体情况。

基本上我正在寻找以下输出。

Job Name  Task Name  Staff Name  Date                 Minutes Billable
My Job    My Task    My Name     2017-05-19T00:00:00  480     true

根据要求,这是从 API 返回 XML 的方式(作为字符串并由 print(ts.content) 查看),这可能是我出错的地方。

<Times><Time><ID> 120877787 </ID><Job><ID> J000050 </ID><Name> My Job </Name></Job><Task><ID> 59469972 </ID><Name> My Task </Name></Task><Staff><ID>74268</ID><Name> My Name </Name></Staff><Date> 2017-05-19T00:00:00 </Date><Minutes> 480 </Minutes><Note/><Billable> true </Billable></Time></Times>

有人可以提供一些关于完成这项任务的最佳方法的见解吗?

感谢您的帮助。

斯科特

【问题讨论】:

  • 下午?快半夜了……

标签: xml python-3.x csv


【解决方案1】:

你可以使用findall函数。

import xml.etree.ElementTree as ET
import csv

tree = ET.parse("/temp/test.xml")
root = tree.getroot()

f = open('/temp/test.csv', 'w')

csvwriter = csv.writer(f)

count = 0

head = ['Job Name','Task Name','Staff Name','Date','Minutes','Billable']

csvwriter.writerow(head)

for time in root.findall('Time'):
    row = []
    job_name = time.find('Job').find('Name').text
    row.append(job_name)
    task_name = time.find('Task').find('Name').text
    row.append(task_name)
    staff_name = time.find('Staff').find('Name').text
    row.append(staff_name)
    date = time.find('Date').text
    row.append(date)
    minutes = time.find('Minutes').text
    row.append(minutes)
    billable = time.find('Billable').text
    row.append(billable)
    csvwriter.writerow(row)
f.close()

这给出了:

Job Name,Task Name,Staff Name,Date,                Minutes,Billable
 My Job , My Task , My Name , 2017-05-19T00:00:00 , 480 , true 

【讨论】:

  • 我正在使用 print(ts.content) 查看我的 API 查询结果。我是否将 tree = ET.parse("/temp/test.xml") 中的 /temp/test.xml 替换为 ts.content?
  • 我尝试使用 ET.fromstring() 代替,但这会导致 csv 仅包含标题行。您还有其他建议吗?
  • 你的 api 结果是什么?可以给吗?
  • 我已将从 API 收到的输出添加到原始帖子中。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多