我试图让一个Python 3程序对一个充满信息的文本文件做一些操作。然而,当我试图读取文件时,我得到以下错误:
Traceback (most recent call last):
File "SCRIPT LOCATION", line NUMBER, in <module>
text = file.read()
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 0x90 in position 2907500: character maps to `<undefined>`
TLDR: Try: file = open(filename, encoding='cp437')
为什么?当某人使用:
file = open(filename)
text = file.read()
Python假定该文件使用与当前环境相同的代码页(如果是开始的帖子,则为cp1252),并尝试将其解码为其自己的默认UTF-8。如果文件包含未在此代码页中定义的值的字符(如0x90),则得到UnicodeDecodeError。有时我们不知道文件的编码,有时文件的编码可能没有被Python处理(例如cp790),有时文件可以包含混合编码。
如果不需要这些字符,可以决定用问号替换它们,如下所示:
file = open(filename, errors='replace')
另一个解决方法是使用:
file = open(filename, errors='ignore')
字符将保持完整,但其他错误也将被掩盖。
一个很好的解决方案是指定编码,但不是任何编码(如cp1252),而是定义了所有字符的编码(如cp437):
file = open(filename, encoding='cp437')
代码页437是原始的DOS编码。所有的代码都被定义,所以在读取文件时没有错误,没有错误被掩盖,字符被保留(不是完全完整,但仍然可以区分)。