我试图让一个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>`  

该文件没有使用CP1252编码。它使用了另一种编码。哪一个你得自己想清楚。常见的是Latin-1和UTF-8。由于在Latin-1中0x90实际上没有任何含义,因此更可能是UTF-8(其中0x90是一个延续字节)。

打开文件时指定编码:

file = open(filename, encoding="utf8")

作为@LennartRegebro回答的延伸:

如果你不知道你的文件使用的是什么编码,上面的解决方案也不起作用(不是utf8),你发现自己只是在猜测——有一些在线工具可以用来识别那是什么编码。它们并不完美,但通常都能正常工作。在你弄清楚编码之后,你应该能够使用上面的解决方案。

编辑:(摘自评论)

一个非常流行的文本编辑器Sublime text有一个命令来显示编码,如果它已设置…

进入视图->显示控制台(或Ctrl+ ')

在底部view.encoding()输入字段,并希望最好的(我无法得到任何东西,但未定义,但也许你会有更好的运气…)


如果file = open(filename, encoding="utf-8")不起作用,请尝试 File = open(filename, errors="ignore"),如果你想删除不需要的字符。(文档)


或者,如果你不需要解码文件,比如将文件上传到网站,可以使用:

open(filename, 'rb')

r =读数,b =二进制


对于那些在Windows中开发Anaconda的人,我也遇到了同样的问题。notepad++帮我解决它。

在notepad++中打开文件。在右下方,它会告诉你当前的文件编码。 在顶部菜单中,在“视图”旁边找到“编码”。在“编码”转到“字符集”,耐心地寻找你需要的编码。在我的例子中,编码“Windows-1252”在“西欧”下找到了


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编码。所有的代码都被定义,所以在读取文件时没有错误,没有错误被掩盖,字符被保留(不是完全完整,但仍然可以区分)。


对我来说,改变Mysql字符编码一样,我的代码有助于整理出解决方案。照片=开放(pic3.png,编码= latin1)中的一个


不要再浪费你的时间了,只要在读写代码中添加以下encoding="cp437"和errors='ignore'即可:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

祝成功


在应用建议的解决方案之前,可以检查文件(以及错误日志)中出现的Unicode字符是什么,在本例中是0x90: https://unicodelookup.com/#0x90/1(或通过搜索0x0090直接访问Unicode Consortium网站http://www.unicode.org/charts/)

然后考虑将其从文件中删除。


对我来说,用utf16编码是有效的

file = open('filename.csv', encoding="utf16")

在Python的新版本(从3.7开始)中,您可以添加解释器选项-Xutf8,这应该可以解决您的问题。如果你使用Pycharm,只需运行>编辑配置(在选项卡配置更改值字段解释器选项-Xutf8)。

或者,同样地,您可以将环境变量PYTHONUTF8设置为1。


def read_files(file_path):

    with open(file_path, encoding='utf8') as f:
        text = f.read()
        return text

或(和)

def read_files(text, file_path):

    with open(file_path, 'rb') as f:
        f.write(text.encode('utf8', 'ignore'))