2010-07-19 33 views
2

我工作的一系列解析器在那裏我得到了一堆回溯從我的單元測試一樣的:的Python 3扼流圈CP-1252/ANSI閱讀

File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined> 

的文件與開開()沒有額外的爭論。我可以傳遞額外的參數來打開()或使用編解碼器模塊中的某些內容來打開它們的不同嗎?

這個代碼是用Python 2編寫的,用2to3工具轉換爲3。

更新:事實證明這是一個zip文件喂入解析器的結果。單元測試實際上預計會發生。解析器應該將它識別爲無法解析的東西。所以,我需要改變我的異常處理。在現在這樣做的過程中。

回答

10

位置0x81在Windows-1252(又名cp1252)中未分配。它被分配給拉丁語-1(又名ISO 8859-1)的U + 0081 HIGH OCTET PRESET(HOP)控制字符。我可以重現你的錯誤在Python 3.1這樣的:

>>> b'\x81'.decode('cp1252') 
Traceback (most recent call last): 
    ... 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined> 

或與實際文件:

>>> open('test.txt', 'wb').write(b'\x81\n') 
2 
>>> open('test.txt').read() 
Traceback (most recent call last): 
    ... 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte 

我們把這個文件作爲Latin-1的你通過encoding說法,像codeape建議:

>>> open('test.txt', encoding='latin-1').read() 
'\x81\n' 

當心有Windows的1257和拉丁美洲-1編碼,例如之間的差異拉丁語-1沒有「聰明的引號」。如果你正在處理的文件是一個文本文件,問問你自己在做什麼。

+0

FWIW Latin-1已分配所有256個碼點,因此您永遠不會收到UnicodeDecodeError。但是你可能會破壞你的數據。 – 2010-07-19 22:09:01

3

您可以放鬆錯誤處理。

例如:

f = open(filename, encoding="...", errors="replace") 

或者:

f = open(filename, encoding="...", errors="ignore") 

the docs

編輯:

但你可以肯定,問題是在閱讀文件?當某些事情被寫入控制檯時,是否會發生異常?檢查http://wiki.python.org/moin/PrintFails

+0

我嘗試了這兩個結果相同。在輸出發生之前拋出錯誤。 – 2010-07-19 21:15:05

+1

-1「放鬆錯誤處理」並不知道什麼被忽略或爲什麼 - 盲目的屠殺 – 2010-07-19 22:43:40

+0

確實,忽略編碼錯誤是不好的做法,違反了Unicode標準。 – Philipp 2010-07-20 08:36:56

2

所有文件都是「不是Unicode」。 Unicode是必須進行編碼的內部表示。您需要爲每個文件確定使用了哪種編碼,並在文件打開時指定必要的地方。

作爲追蹤和錯誤消息指示有問題的文件不在cp1252編碼。

如果在latin1編碼,它是抱怨"\x81"是不連有一個名稱(Unicode)的一個C1控制字符。 考慮latin1極不可能有效。

你說「有些文件是用xml.dom.minidom解析的 - 解析成功還是失敗?

有效的XML文件應在第一行中聲明其編碼(默認爲UTF-8),並且不需要在代碼中指定編碼。向我們展示您用於執行xml.dom.minidom解析的代碼。

「其他人直接讀取爲迭代」 - 請示範代碼。

建議:嘗試在瀏覽器中打開每種類型的文件。然後點擊查看並點擊字符編碼(Firefox)或編碼(Internet Explorer)。瀏覽器猜測哪些編碼[通常可靠]?

其他可能的編碼線索:文件中使用哪些語言?你從哪裏得到這些文件?

注意:請編輯您的問題,澄清信息;不要在評論中回答。

+0

它可能是一個DOS代碼頁面,其中'\ x81'通常是'ü'。 – dan04 2010-07-19 23:44:33