2017-02-07 183 views
1

我需要使用python解析XML文檔(TMX map format)中的一些CSV數據,但我被卡住了。解析XML文檔中的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? 

往上看,建議將參數應用到open()函數的CSV模塊的文檔,但它在這裏顯然是不可能的。

我試圖用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

什麼會CSV數據看,如果是從XML的片段正確地提取它像在你的問題?它有多少行?如果只有一個,你應該[編輯]你的問題,並添加至少兩個片段。 – martineau

+0

[TMX地圖格式](http://doc.mapeditor.org/reference/tmx-map-format/)鏈接中的信息[不多說](http://doc.mapeditor.org/reference/tmx-map-format /#data)關於數據在編碼=「csv」'時的格式。你有更好的參考?否則,如果沒有一個更完整的實際數據的例子,這全是猜測...... – martineau

回答

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