从XML文档中解析CSV

时间:2017-02-07 11:31:32

标签: python xml csv

我需要使用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字符,但我不知道如何从这里开始......

1 个答案:

答案 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', '']