2016-08-01 85 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 。我将输出写入另一个文件并且感到困惑,因为生成的文件在两种方法上看起来都一样,而且在输入数据后我忽略了不同的类型。 –