【问题标题】:Python XML Parsing - Get XML File NamePython XML 解析 - 获取 XML 文件名
【发布时间】: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


【解决方案1】:

让这个工作:

from itertools import izip
import xml.etree.ElementTree as et
import os
import csv

fruit = []
color = []
filenames = []

directory = os.path.dirname(os.path.realpath(__file__))

for filename in os.listdir(directory):
    if filename.endswith('.xml'):
        e = et.parse(filename).getroot()
        for x in e.findall('CASE'): fruit.append(x.get('Fruit'))
        for x in e.findall('CASE'): color.append(x.get('Color'))
        for x in e.findall('CASE'): filenames.append(filename)

with open('parsed.csv', 'wb') as myfile:
    fieldnames = ["fruit","color","filenames"]
    writer = csv.writer(myfile)
    writer.writerow(fieldnames)
    writer.writerows(izip(fruit,color,filenames))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 2021-11-15
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多