我需要使用python从XML文档(TMX map format)中解析一些CSV数据,但我被卡住了。
我想使用标准的svg和ElTree模块,如果可能的话,我必须使用Python 2.7。
这是我正在处理的XML文档的片段:
<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数据的代码片段:
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字符,但我不知道如何从这里开始......
答案 0 :(得分:2)
我认为你可以使用你的第一个代码选项实现你的目标,只需稍作修改:
似乎问题在于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', '']