Windows UnicodeDecodeError:&x27;charmap';编解码器可以';t解码Y位置的字节X:字符映射到<;未定义>;
我试图让一个Python3程序对一个充满信息的文本文件进行一些操作。但是,在尝试读取文件时,我遇到以下错误:Windows UnicodeDecodeError:&x27;charmap';编解码器可以';t解码Y位置的字节X:字符映射到<;未定义>;,windows,python-3.x,unicode,file-io,decode,Windows,Python 3.x,Unicode,File Io,Decode,我试图让一个Python3程序对一个充满信息的文本文件进行一些操作。但是,在尝试读取文件时,我遇到以下错误: 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
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>`
回溯(最近一次呼叫最后一次):
文件“脚本位置”,行号,在
`text=file.read()`
文件“C:\Python31\lib\encodings\cp1252.py”,第23行,解码
`返回编解码器.charmap\u解码(输入、自身错误、解码表)[0]`
UnicodeDecodeError:“charmap”编解码器无法解码2907500位置的字节0x90:字符映射到“%1”
相关文件未使用CP1252
编码。它正在使用另一种编码。哪一个你必须自己弄清楚。常见的是Latin-1
和UTF-8
。由于0x90在拉丁语-1
中实际上没有任何含义,因此更可能是UTF-8
(其中0x90是一个连续字节)
打开文件时指定编码:
file = open(filename, encoding="utf8")
作为对以下内容的扩展:
如果您不知道文件使用的是什么编码,而上面的解决方案不起作用(它不是utf8
),并且您发现自己只是在猜测,那么您可以使用这些方法来确定这是什么编码。它们并不完美,但通常工作正常。在您弄清楚编码之后,您应该能够使用上面的解决方案
编辑:(从评论中复制)
一个相当流行的文本编辑器Sublime text
有一个命令,如果已设置,则显示编码
查看
->显示控制台
(或Ctrl+`)view.encoding()
,希望一切顺利(除了Undefined
之外,我什么都找不到,但也许你会有更好的运气……)file=open(filename,encoding=“utf-8”)
不起作用,请尝试file=open(filename,errors=“ignore”)
,如果要删除不需要的字符。()或者,如果您不需要对文件进行解码,例如将文件上载到网站,open(filename,'rb')
其中r=读取,b=二进制对于那些在Windows中使用Anaconda的人,我也遇到了同样的问题。记事本++帮我解决它 在记事本++中打开该文件。在右下角,它将告诉您当前的文件编码。
在顶部菜单中,在“查看”旁边找到“编码”。在“编码”中,转到“字符集”,然后与patiente一起查找您需要的编码。在我的例子中,编码“Windows-1252”是在“西欧”下找到的?尝试:
file=open(文件名,编码='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):
代码页437是原始的DOS编码。所有代码都已定义,因此在读取文件时没有错误,没有错误被掩盖,字符被保留(没有完全保留完整,但仍然可以区分)。对于我来说,更改Mysql字符编码与我的代码相同有助于解决方案的排序`photo=open('pic3.png',编码=latin1), strong文本
停止浪费时间,只需将以下
encoding=“cp437”
和errors='ignore'
添加到您的代码中即可进行读写操作:
open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')
Godspeed在应用建议的解决方案之前,您可以检查文件(以及错误日志)中出现的Unicode字符是什么,在这种情况下,
0x90
:(或者通过搜索0x0090
,直接在Unicode Consortium站点)
然后考虑从文件中删除它。< /P> < P>用UTF16编码的ME工作
file = open('filename.csv', encoding="utf16")
很酷,我尝试在Python3.4中运行的一些Python2.7代码有这个问题。拉丁-1为我工作!如果您使用的是Python2.7,并且出现了相同的错误,请尝试
io
模块:io.open(filename,encoding=“utf8”)
@1vand1ng0:当然,拉丁语-1可以工作;无论文件的实际编码是什么,它都适用于任何文件。这是因为一个文件中所有256个可能的字节值都有一个拉丁-1代码点要映射,但这并不意味着您可以得到清晰的结果!如果您不知道编码,那么即使以二进制模式打开文件也可能比使用拉丁语-1要好。默认情况下,它是unicode,但unicode不是编码filename=“C:\Report.txt”,并将open(filename,encoding=“utf8”)作为我的\u文件:text=my\u file.read()print(text)
即使使用此选项,我也会收到相同的错误。我也尝试过其他编码,但都是徒劳的。在此代码中,我还使用了来自geotext import geotext的。请提出解决方案。一些文本编辑器也会提供此信息。我知道,使用vim,您可以通过:set fileencoding
()Sublime Text获得此信息,也可以打开控制台并键入view.encoding()
。或者,您可以使用记事本打开文件“另存为”,您将看到一个下拉列表,其中包含使用的编码。对于这些解决方案帮助我的相同错误,请查看以了解您为什么会出现此错误。非常感谢-我将给出
file = open('filename.csv', encoding="utf16")