UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to <undefined>
我试图让一个python 3程序对一个包含信息的文本文件进行一些操作。但是,当尝试读取文件时,我得到以下错误:
Traceback (most recent call last):
File"SCRIPT LOCATION", line NUMBER, in
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
如果有人能帮助我克服这个问题,我将不胜感激。
- 对于同样的错误,这些解决方案帮助了我,解决了charmap错误
- 请参见在python 3中处理文本文件以了解为什么会出现此错误。
所讨论的文件没有使用CP1252编码。它正在使用另一种编码。哪一个你必须自己弄清楚。常见的有Latin-1和UTF-8。由于0x90实际上在Latin-1中没有任何意义,所以UTF-8更可能(其中,0x90是一个连续字节)。
打开文件时指定编码:
1
| file = open(filename, encoding="utf8") |
- 很酷,我在Python3.4中运行的一些Python2.7代码遇到了这个问题。拉丁-1为我工作!
- 谢谢@1vand1ng0 utf-8对我不起作用,但拉丁语-1起作用了
- 如果您使用的是python2.7,并且得到相同的错误,请尝试使用io模块:io.open(filename,encoding="utf8")。
- +1用于指定读取时的编码。另外,它应该是encoding="utf8"还是encoding="utf-8"?
- @达沃斯的两个拼法都有效。
- @1vand1ng0:当然,拉丁语-1有效;不管文件的实际编码是什么,它都适用于任何文件。这是因为一个文件中所有256个可能的字节值都有一个要映射到的拉丁-1码位,但这并不意味着您得到了清晰的结果!如果您不知道编码,即使以二进制模式打开文件,也可能比假设使用拉丁语1更好。
- 即使在open()中编码已经正确指定为utf-8(如上所示),我还是会得到op错误。有什么想法吗?
- 那么它就不是正确的UTF-8。
- 谢谢!我的程序在Ubuntu python3中运行得很好,但是在Windows操作系统中,会出现错误,所以我想无论在哪里读或写非拉丁文本,都必须指定编码。有趣的是,我假设python3默认为Unicode。
- 默认情况下它是Unicode,但Unicode不是编码。regebro.wordpress.com/2011/03/23/&hellip;
- 在我使用这个之后,这个错误得到了解决,但随后我得到了这个错误unicodedecodeerror:'utf-8'编解码器无法在位置上解码字节0x92
- 那就不是UTF8了。
- filename ="C:
eport.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)即使使用了这个,我也会得到同样的错误。我也尝试过其他编码,但都是徒劳的。在这段代码中,我还使用了from geotext import GeoText。请提出解决方案。
- @萨拉,既然所有其他的都失败了,你可以试试德克兰·纳多齐最下面的答案。它可能无法提供完全清晰的结果,但根据您的应用,这可能仍然是可以接受的。
作为@lennarrtregebro答案的扩展:
如果你不知道它是什么编码,而上面的解决方案不起作用(它不是utf8),你发现自己只是在猜测——有一些在线工具可以用来识别编码是什么。它们并不完美,但通常工作得很好。在计算出编码之后,您应该能够使用上面的解决方案。
编辑:(从注释复制)
一个相当流行的文本编辑器Sublime Text有一个命令来显示编码,如果它被设置了…
转到View->Show Console(或ctrl+`)
在最下面的view.encoding()处输入字段,并希望得到最好的结果(除了Undefined以外,我什么也得不到,但也许你会有更好的运气…)
- 一些文本编辑器也将提供这些信息。我知道有了Vim,你可以通过:set fileencoding从这个链接得到这个。
- 升华文本,也——打开控制台,输入view.encoding()。
加上万一file = open(filename, encoding="utf8")不起作用试试file = open(filename, errors='ignore')。
- 非常感谢-我会试试的。在我不关心的部分文件中有一些无效字符。
- 与errors='ignore'配合良好
- 警告:当遇到未知字符时,这将导致数据丢失(视情况而定)。