2016-08-01 82 views
2

我試圖加載一個文本文件,其中包含與Python的讀取非ASCII文本文件

content=open("file.txt","r").read() 

導致此錯誤消息德國的一些信件

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 26: ordinal not in range(128) 

如果我修改該文件只包含ASCII字符一切都按預期工作。

Apperently使用

content=open("file.txt","rb").read() 

content=open("file.txt","r",encoding="utf-8").read() 

都做的工作。

爲什麼使用「二進制」模式讀取並獲得與utf-8編碼相同的結果?

回答

3

ASCII限於[0,128)範圍內的字符。如果您嘗試解碼超出該範圍的字節,則會出現該錯誤。

當您以字節讀取字符串時,您將可接受的字符範圍「擴大」爲[0,256]。所以你的\ 0xc3字符Ã現在被讀入沒有錯誤。但儘管似乎有效,但仍然不「正確」。

如果您的字符串確實是unicode編碼的,則可能存在一個字符包含多字節字符的情況,即字節表示實際跨越多個字節的字符。

在這種情況下,讀取文件作爲字節字符串和正確解碼文件之間的區別將非常明顯。

像這樣的字符:C

將被讀取的兩個字節,但正確地解碼,將是一個字:

bytes = bytes('č', encoding='utf-8') 

print(len(bytes))     # 2 
print(len(bytes.decode('utf-8'))) # 1 
5

在Python 3中,使用'r'模式並且不指定編碼只是使用默認編碼,在本例中爲ASCII。使用'rb'模式將文件讀取爲字節,並且不會嘗試將其解釋爲一串字符。

+0

好吧,我看到'型(開放式(ULF_DIR +「Banken銀行。 ())「返回」字節「和」類型「(open(ULF_DIR +」Banken.txt「,」r「,encoding =」utf-8「)。read())'返回str 。我將輸出寫入另一個文件並且感到困惑,因爲生成的文件在兩種方法上看起來都一樣,而且在輸入數據後我忽略了不同的類型。 –