2014-05-22 72 views
1

再一次,處理字符編碼的問題已經開始困擾着我。 我打開包含XML和其導入文本文件到由Python 3.4中的文本編碼Flummoxxed:如何防止「UnicodeEncodeError:'charmap'編解碼器無法編碼」

import xml.etree.ElementTree as ET 
import codecs 

f = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.nxml','r',encoding='cp1252') 
myTree = ET.parse(f) 
f.close() 

of = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.txt','w')  
for elem in myTree.iter('sec'): 
    of.write(elem2StringRecurse(elem)) #gets mad here 
of.close() 

給出的錯誤是

line 197, in <module> 
of.write(elem2StringRecurse(elem)) 
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode 
return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u2265' 
in position 139: character maps to <undefined> 

我的問題是雙重的。首先,儘管一個經驗豐富的程序員研究這個問題已經比通常更混亂,因爲這在Python 2和3中的處理方式不同。 因此,我不確定錯誤的含義。 我知道一些意大利的「a」看起來是個人物。 它是否告訴我,沒有Unicode替換

二,如何在普通情況下防止這種情況?我正在嘗試編寫代碼來抽取和轉儲自然語言處理的文本文件:從XML - >純文本。我不能讓它崩潰在這樣的事情上;我的意思是,我相信我可以手動編輯出有問題的人物,但我不能在任何事情做的1000次......

回答

2

使用

f = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.nxml', 'r', encoding='utf-8') 

of = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.txt', 'w', encoding='utf-8') 

編碼XML除了UTF-8以外,它正在尋求麻煩。

看看你的文件(鏈接在評論中),很明顯它是用ASCII編碼的,它是UTF-8的一個子集(也是cp1252的一個子集,這可能是爲什麼Firefox和jEdit猜測它使用的是編碼)。它還包含0xff以外的幾個Unicode轉義,即ElementTree似乎將解析爲Unicode代碼點。如果您試圖將其保存回cp1252編碼的文件,您遇到的錯誤就是結果。

+0

謝謝你的回答。我使用的是'cp1252'編解碼器,因爲該文件是在該編解碼器中編碼的。 (由Jedit和FireFox確認)。這不正確嗎? 也 - >它現在的作品,謝謝。 – BAMF4bacon

+0

它是否在XML文件本身中說'encoding ='cp1252''?這是可能的,但該編碼不知道「歐洲」語言中使用的幾個字符。你可以將文件發佈到某個地方或給我們一個鏈接嗎? –

+0

她在這裏:https://drive.google.com/file/d/0B3RjoEb8jEORalAtYi1zemVXS2s/edit?usp=sharing – BAMF4bacon

相關問題