2014-03-12 39 views
0

我正在使用this Python腳本將CSV轉換爲XML。轉換後,我在文本(vim)中看到標籤,這會導致XML解析錯誤。從文件中刪除<feff>

enter image description here

我已經嘗試從here的答案,但沒有成功。

轉換後的XML file

感謝您的幫助!

+3

簡單的答案是,不要使用Python腳本,它實際上並不知道如何編寫有效的XML。而不是試圖修復產生不良輸出的東西,而應該使用能夠以正確的方式完成工作的東西。 –

+0

嗯!我將不勝感激任何其他建議爲通用cli csv2xml轉換器。 :) – Adrian

+0

有沒有這樣的事情(和你鏈接到的不是一個),因爲沒有單一的,通用的方式來表示結構化語言中的表格語法。你指出的那個工具對於輸出應該是什麼樣子做了一些假設;對此它沒有任何「普遍性」。也就是說,如果澄清一下輸出結果應該是多少,幾乎任何有能力的開發人員都可以在五分鐘內寫出這樣的工具。 –

回答

5

您的輸入文件具有BOM(字節順序標記)字符,並且在使用utf8編碼文件時,Python不會自動去除它們。請參閱:Reading Unicode file data with BOM chars in Python

>>> s = '\xef\xbb\xbfABC' 
>>> s.decode('utf8') 
u'\ufeffABC' 
>>> s.decode('utf-8-sig') 
u'ABC' 

因此,對於您的特定情況下,你可以試試

from io import StringIO 
s = StringIO(open(csvFile).read().decode('utf-8-sig')) 
csvData = csv.reader(s) 

非常可怕的風格,但劇本是一起黑客腳本反正一次性的工作。

+0

感謝您的幫助!我替換了relatd部分,但是我得到了這個錯誤:文件「x.py」,第26行,在 行中csvData: UnicodeEncodeError:'ascii'編解碼器無法編碼字符u'\ u20ac'在位置133:序號不在範圍內(128) – Adrian

+1

哪個python版本?如果版本3的open/read方法應該產生一個unicode字符串,並且要刪除第一個BOM字符,我提供的示例代碼就是告訴你可能會在後臺發生什麼 - 你可以做' s = s [1:]'這會起作用。學習尋找實際正在做的事情,並嘗試理解邏輯,而不是盲目地遵循解決方案。 – metatoaster

0

下面是一個腳本示例,該腳本使用真正的XML感知庫來運行類似的轉換。它沒有完全相同的輸出,但是,這是一個例子 - 鹽的味道。

import csv 
import lxml.etree 

csvFile = 'myData.csv' 
xmlFile = 'myData.xml' 

reader = csv.reader(open(csvFile, 'r')) 
with lxml.etree.xmlfile(xmlFile) as xf: 
    xf.write_declaration(standalone=True) 
    with xf.element('root'): 
    for row in reader: 
     row_el = lxml.etree.Element('row') 
     for col in row: 
     col_el = lxml.etree.SubElement(row_el, 'col') 
     col_el.text = col 
     xf.write(row_el) 

,指的是,比如說,第2行3列的內容,你會再使用XPath像/row[2]/col[3]/text()

0

更改UTF-8 UTF-8-SIG

 
import csv 
with open('example.txt', 'r', encoding='utf-8-sig') as file: