2017-02-07 2 views
1

Мне нужно проанализировать некоторые данные CSV из XML-документа (TMX map format) с помощью python, но я застрял.Анализ CSV из документа XML

Я хочу использовать стандартные модули 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? 

Глядя на модуль Docs 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

Что бы 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 

Б.Г. будет выглядеть следующим образом:

['0', '0', '0', '0', '0', '1264', '1265', '1266', '1267', '', '1268', '1269', '1270', '0', '0', '0', '0', '0', '0', ''] 
Смежные вопросы