我正在尝试使用填充了信息的文本文件来对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>
如果有人能帮助我试图解决这个问题,我将非常感激。
答案 0 :(得分:637)
相关文件未使用CP1252
编码。它正在使用另一种编码。你需要弄清楚哪一个。常见的是Latin-1
和UTF-8
。由于 0x90 实际上并不代表Latin-1
中的任何内容,UTF-8
(其中 0x90 是一个连续字节)更有可能。
您在打开文件时指定编码:
file = open(filename, encoding="utf8")
答案 1 :(得分:31)
作为@LennartRegebro的扩展回答:
如果你不知道它是什么编码并且上面的解决方案不起作用(它不是utf8
)而你发现自己只是猜测 - 你可以使用online tools来识别哪种编码那是。它们并不完美但通常工作得很好。在计算出编码后,您应该可以使用上面的解决方案。
编辑:(从评论中复制)
一个非常流行的文本编辑器Sublime Text
有一个显示编码的命令,如果它已被设置...
答案 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字符是什么,在这种情况下为0x90
:https://unicodelookup.com/#0x90/1(或直接在Unicode中)通过搜索0x0090
)的联盟网站http://www.unicode.org/charts/
,然后考虑将其从文件中删除。
答案 7 :(得分:0)
或者,如果您不需要解码文件,例如将文件上传到网站open(filename, 'rb')
。 r =读数,b =二进制
答案 8 :(得分:0)
答案 9 :(得分:0)
对我来说用 utf16 编码有效
file = open('filename.csv', encoding="utf16")