【发布时间】:2018-04-05 16:28:38
【问题描述】:
我有一个工作 Python 2.7 脚本,它解析在同一目录中找到的所有 XML 文件,并将它们保存到 CSV 文件。
问题
如何修改以下代码以显示(在 CSV 输出文件中)解析记录来自哪个 XML 文件?
示例 XML 文件
Fruit1.xml
<CASES>
<CASE
Fruit="Apple"
Color="Red">
</CASE>
<CASE
Fruit="Pear"
Color="Yellow">
</CASE>
</CASES>
Fruit2.xml
<CASES>
<CASE
Fruit="Banana"
Color="Yellow">
</CASE>
<CASE
Fruit="Orange"
Color="Orange">
</CASE>
</CASES>
当前代码
from itertools import izip
import xml.etree.ElementTree as et
import os
import csv
def run(files):
first = None
for filename in os.listdir(files):
if filename.endswith('.xml'):
e = et.parse(filename).getroot()
if first is None: first = e
else: first.extend(e)
return first
fruit = []
color = []
e = run(os.path.dirname(os.path.realpath(__file__)))
for x in e.findall('CASE'): fruit.append(x.get('Fruit'))
for x in e.findall('CASE'): color.append(x.get('Color'))
with open('parsed.csv', 'wb') as myfile:
fieldnames = ["fruit","color"]
writer = csv.writer(myfile)
writer.writerow(fieldnames)
writer.writerows(izip(fruit,color))
电流输出
+--------+--------+
| fruit | color |
+--------+--------+
| Apple | Red |
| Pear | Yellow |
| Banana | Yellow |
| Orange | Orange |
+--------+--------+
所需的输出
+--------+--------+------------+
| fruit | color | filename |
+--------+--------+------------+
| Apple | Red | fruit1.xml |
| Pear | Yellow | fruit1.xml |
| Banana | Yellow | fruit2.xml |
| Orange | Orange | fruit2.xml |
+--------+--------+------------+
我尝试使用元组将 XML 文件名与解析的 XML 元素配对,但无法使其正常工作。
【问题讨论】:
-
为什么您的代码的 XML 处理和文件名处理方面有任何关系?整个“以第一个元素为根并对其进行扩展”的设计是......我想这是一个可行的选项,但您可以轻松地让您的代码返回
{ filename: element_root }形式的映射。 -
甚至更好,
{ filename: (fruit, color) }之类的 - 这也减少了您的内存需求,因为您一次只需要存储一个已解析的 DOM。 -
...哎呀,你可以实现一个返回
(filename, fruit, color)tuples 的迭代器。 -
@CharlesDuffy 感谢您的意见!我对 Python 还是很陌生,困惑了一段时间,但我想通了,会发布答案
标签: python xml csv parsing elementtree