UnicodeDecodeError:'charmap'编解码器无法解码位置Y的字节X:字符映射到<undefined> </undefined>

时间:2012-02-10 18:43:58

标签: windows python-3.x unicode file-io decode

我正在尝试使用填充了信息的文本文件来对Python 3程序进行一些操作。但是,在尝试读取文件时,我收到以下错误:

  

追踪(最近的呼叫最后):
      文件“SCRIPT LOCATION”,第NUMBER行,在       text = file.read()
      文件“C:\ Python31 \ lib \ encodings \ cp1252.py”,第23行,在解码中       return codecs.charmap_decode(input,self.errors,decoding_table)[0]
      UnicodeDecodeError:'charmap'编解码器无法解码位置2907500中的字节0x90:字符映射到<undefined>

如果有人能帮助我试图解决这个问题,我将非常感激。

10 个答案:

答案 0 :(得分:637)

相关文件未使用CP1252编码。它正在使用另一种编码。你需要弄清楚哪一个。常见的是Latin-1UTF-8。由于 0x90 实际上并不代表Latin-1中的任何内容,UTF-8(其中 0x90 是一个连续字节)更有可能。

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

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

答案 1 :(得分:31)

作为@LennartRegebro的扩展回答:

如果你不知道它是什么编码并且上面的解决方案不起作用(它不是utf8)而你发现自己只是猜测 - 你可以使用online tools来识别哪种编码那是。它们并不完美但通常工作得很好。在计算出编码后,您应该可以使用上面的解决方案。

编辑:(从评论中复制)

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

  1. 转到View - &gt; Show Console(或 Ctrl + `
  2. enter image description here

    1. 键入底部view.encoding()的字段并希望获得最佳效果(我除了Undefined之外无法获得任何内容,但也许您会有更好的运气...)
    2. enter image description here

答案 2 :(得分:24)

只是添加以防file = open(filename, encoding="utf8")无效 试试file = open(filename, errors='ignore')

答案 3 :(得分:3)

不要浪费您的时间,只需将以下encoding="cp437"errors='ignore'添加到您的代码中即可进行读写:

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

Godspeed

答案 4 :(得分:1)

对于那些在Windows的Anaconda中工作的人,我遇到了同样的问题。 Notepad ++可以帮助我解决它。

在记事本++中打开文件。在右下角,它将告诉您当前的文件编码。 在顶部菜单中,在“视图”旁边找到“编码”。在“编码”中,转到“字符集”,然后耐心地寻找所需的编码。在我的情况下,在“西欧”下找到了编码“ Windows-1252”

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

或者,如果您不需要解码文件,例如将文件上传到网站open(filename, 'rb')。 r =读数,b =二进制

答案 8 :(得分:0)

对我来说,更改与我的代码相同的Mysql字符编码有助于找出解决方案。 `photo = open('pic3.png',encoding = latin1), strong文本 enter image description here

答案 9 :(得分:0)

对我来说用 utf16 编码有效

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