【发布时间】: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"时如何格式化的信息。你有更好的参考吗?否则,如果没有更完整的实际数据示例,一切都是猜测......