2011-08-03 175 views
0

用這種錯誤做什麼?您正在讀取文件中的行。你不知道編碼。python編碼錯誤

「字節0xed」是什麼意思? 「位置3792」是什麼意思?

我會嘗試自己回答並重新發布,但只要我明白這一點,我就會感到有些懊惱。是否有一個clobber /忽略和繼續方法來獲取未知的編碼?我只想讀一個文本文件!

Traceback (most recent call last): 
    File "./test.py", line 8, in <module> 
    for x in fin: 
    File "/bns/rma/local/lib/python3.1/encodings/ascii.py", line 26, in decode 
    return codecs.ascii_decode(input, self.errors)[0] 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xed in position 3792: ordinal not in range(128) 
+0

要閱讀一個文本文件,你需要它的編碼。默認的ascii編碼可能經常使用,但不在這裏。 –

回答

3

0xedí,這是在位置3792包含在輸入Unicode碼(即,如果算上開始的第一個字母時,第三千七百九十二信將í)。

您正在使用ASCII編碼解碼器對文件進行解碼,但該文件沒有ASCII編碼,嘗試用支持Unicode編碼解碼器,而不是(utf_8也許?),或者,如果你知道用來寫文件的編碼,從available codecs的完整列表中選擇適當的編碼。

+0

謝謝!這回答了一些問題......但是,人們如何選擇編碼?這是不平凡的。我只是想愚蠢地推着玩,並閱讀文件,就好像我在文本編輯器中,並處理任何垃圾,我可以看到...我只是使用開放(文件,'rb')和處理混亂? ...但是我沒有字符串。我不太清楚快速修復是什麼。 – mathtick

+0

我看到有一個chardet模塊,它具有一些自動檢測功能,但它看起來是非標準的。 – mathtick

+0

如果你不知道編碼,那麼沒有絕對的解決辦法。你可以嘗試自動檢測它,但是如果你沒有足夠的樣本,它會在某些時候失效。 – GaretJax

0

我想我找到了辦法是愚蠢的:):

fin = (x.decode('ascii', 'ignore') for x in fin) 

for x in fin: print(x) 

錯誤的位置=「忽略」可能是「替代」或什麼的。這至少跟着我正在尋找的成語「垃圾進入,垃​​圾出來」。

+0

我只注意到編解碼器模塊有一個可選的'錯誤'參數,可以設置爲忽略。即: fin = codecs.open(filename,encoding ='ascii',mode ='r',errors ='ignore') – mathtick