【问题标题】:Parsing CSV from XML document从 XML 文档解析 CSV
【发布时间】:2017-06-24 15:13:11
【问题描述】:

我需要使用 python 从 XML 文档 (TMX map format) 中解析一些 CSV 数据,但我卡住了。

如果可能的话,我想使用标准的 svg 和 ElTree 模块,而且我必须使用 Python 2.7。

这是我正在处理的 XML 文档的 sn-p:

<layer name="Foreground" width="60" height="60">
    <data encoding="csv">
        0,0,0,0,0,1264,1265,1266,1267,
        1268,1269,1270,0,0,0,0,0,0,
    </data>
</layer>

这是我用来打开文件并尝试解析 CSV 数据的代码的 sn-p:

import xml.etree.ElementTree as ET
import csv

self.tree = ET.parse('town.tmx')
self.root = self.tree.getroot()
self.bg = []

for layer in self.root.findall('layer'):
    self.data = layer.find('data').text
    self.reader = csv.reader(self.data)
    for row in self.reader:
        for col in self.reader:
            print col
            self.bg.append(col)

但是打印每个元素都会导致:

['0']['', '']['0']['', '']['0']['', '']['0']

所以,我尝试替换

self.reader = csv.reader(self.data)

self.reader = csv.reader([self.data])

但现在得到错误:

csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

查找 CSV 模块文档,建议将参数应用于 open() 函数,但这显然是不可能的。

我尝试使用itertext而不是文本来获取数据,如下所示:

for layer in self.root.findall('layer'):
    self.data = layer.find('data')
    self.string = "".join(self.data.itertext())
    self.reader = csv.reader([self.string])
    for row in self.reader:
        for col in self.reader:
            print col
            self.bg.append(col)

但我得到了同样的错误。

我的猜测是 ElTree findall 函数正在用错误的格式替换 EOL 字符,但我不知道如何从这里开始......

【问题讨论】:

  • 如果从问题中的 XML 的 sn-p 中正确提取 csv 数据会是什么样子?它有多少行?如果只有一个,你应该edit你的问题并添加一个至少有两个的sn-p。
  • TMX map format 链接doesn't say much 中有关数据在encoded="csv" 时如何格式化的信息。你有更好的参考吗?否则,如果没有更完整的实际数据示例,一切都是猜测......

标签: python xml csv


【解决方案1】:

我认为您可以使用您的第一个代码选项稍作更改来实现您的目标:

似乎问题在于self.data = layer.find('data').text 的外观。它包含许多不需要的空格(制表符、换行符、...)。

通过替换:

for layer in self.root.findall('layer'):
    self.data = layer.find('data').text
    self.reader = csv.reader(self.data)
    for row in self.reader:
        for col in self.reader:
            print col

与:

for layer in self.root.findall('layer'):
    self.data = layer.find('data').text.strip()
    self.data = [x.strip() for x in self.data.split("\n")]
    reader = csv.reader(data)
    for row in self.reader:
        for col in row: # I replaced self.reader with row
            print col

bg 看起来像:

['0', '0', '0', '0', '0', '1264', '1265', '1266', '1267', '', '1268', '1269', '1270', '0', '0', '0', '0', '0', '0', '']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2019-04-27
    • 2021-06-23
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多