UnicodeDecodeError:“charmap”编解码器无法解码位置Y中的字节X:字符映射到<untex>

我正在尝试让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 decodereturn codecs.charmap_decode(input,self.errors,decoding_table)[0]UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`
1344276 次浏览

有问题的文件没有使用CP1252编码。它使用了另一种编码。你必须自己弄清楚哪一种。常见的是Latin-1UTF-8。由于0x90Latin-1中实际上没有任何意义,因此UTF-8(其中0x90是延续字节)更有可能。

您在打开文件时指定编码:

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

作为@LennartRegebro的回答的扩展:

如果你不知道你的文件使用了什么编码,上面的解决方案不起作用(不是utf8),你发现自己只是猜测-你可以使用在线工具来确定是什么编码。它们并不完美,但通常工作得很好。在你弄清楚编码后,你应该能够使用上面的解决方案。

编辑:(从评论中复制)

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

  1. 转到View->Show Console(或Ctrl+'

输入图片描述

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

输入图片描述

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

或者,如果您不需要解码文件,例如将文件上传到网站,请使用:

open(filename, 'rb')

其中r=阅读b=二进制

对于那些在Windows中使用Anaconda的人,我也遇到了同样的问题。Notepad++帮助我解决它。

在Notepad++中打开文件。在右下角,它会告诉您当前的文件编码。在顶部菜单中,在“查看”旁边找到“编码”。在“编码”中转到“字符集”,并在“耐心”中查找您需要的编码。在我的情况下,编码“Windows-1252”在“西欧”下找到

TLDR:尝试: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字符编码与我的代码相同有助于解决方案。photo=open('pic3.png',encoding=latin1)输入图片描述

不要浪费时间,只需在读写代码中添加以下encoding="cp437"errors='ignore'

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

一路顺风

在应用建议的解决方案之前,您可以检查文件中(和错误日志中)出现的Unicode字符是什么,在这种情况下是0x90https://unicodelookup.com/#0x90/1(或通过搜索0x0090直接在Unicode联盟站点http://www.unicode.org/charts/

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

我用utf16编码工作

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

在较新版本的Python(从3.7开始)中,您可以添加解释器选项-Xutf8,这应该可以解决您的问题。如果您使用Py魅力,只需运行>编辑配置(在选项卡配置中将字段解释器选项中的值更改为-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'))