2016-11-15 78 views
0

我試圖打開帶有以下命令的一些配置文件:的UnicodeDecodeError在Python 3.5試圖打開文本文件時

f=open(os.path.join(root, name),mode='rt',errors='ignore') 

不過,我升級到Python 3.5後收到以下錯誤。


for line in f: 
    File "C:\python35-32\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 0x90 in position 57: chara 
cter maps to <undefined> 

此代碼工作得很好時,我跑了使用Python 2.7。我試圖將編碼指定爲utf8或latin1,但現在都沒有工作。如果任何人都能向我推薦一條前進的道路,這將會非常有幫助。

如果我可以忽略該錯誤並轉到下一行,那就沒問題了。我怎樣才能跳過錯誤的部分?

+0

我對python 3不是很熟悉。我認爲你打開一個8位編碼的文件(例如latin1),而解釋器嘗試utf-8。你應該檢查位置57的字節。你可以追加周圍塊的十六進制轉儲(只有幾個字節)嗎? – clemens

回答

1

嘗試指定文件的編碼open(os.path.join(root, name), encoding='utf-8')

+0

嘗試已經收到以下錯誤:對於f中的行: 解碼中的文件「C:\ python35-32 \ lib \ codecs.py」,第321行 (result,consume)= self._buffer_decode(data, self.errors,final) UnicodeDecodeError:'utf-8'編解碼器無法解碼位置10中的字節0x82:無效 起始字節 – Suman

+0

因此,該文件的編碼與utf-8不同。 –

+0

@謝爾蓋:似乎是這樣,但前進的方向是什麼? – Suman

0

您可以使用codecs.open

import codecs 
f = codecs.open(os.path.join(root, name), mode='rt', encoding='utf-8') 
for line in f: 
    #do something 

另外,我不認爲這個問題是你的代碼,而是使用Windows命令提示符其編碼是'cp1252'。我很早就遇到過這個問題。基本上,如果在Windows命令提示符下運行腳本,並且一旦代碼執行打印功能(打印unicode數據),程序就會崩潰,因爲Windows命令提示符無法解碼並打印它。

您還可以通過打印原始數據來解決此問題。也就是說,將所有打印功能改爲print("%r" % line)

+0

嘗試使用編解碼器和獲取以下錯誤:對於f中的行: 文件「C:\ python35-32 \ lib \ codecs.py」,第711行,在__next__中 return next(self.reader) 文件「C:\ python35-32 \ lib \ codecs.py「,行642,在__next__中 line = self.readline() 文件」C:\ python35-32 \ lib \ codecs.py「,第555行,在readline中 data = self .read(readsize,firstline = True) 文件「C:\ python35-32 \ lib \ codecs.py」,第501行,在讀 newchars,decodedbytes = self.decode(data,self.errors) UnicodeDecodeError:' utf-8'編解碼器無法解碼位置14-15中的字節:無效 延續字節 – Suman

+0

那麼,您的文件編碼必須是別的東西。打開文件,執行「另存爲」並將編碼更改爲「UTF-8」(不含BOM),然後嘗試您的代碼。 – user6037143