【问题标题】:UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to <undefined>UnicodeDecodeError:“charmap”编解码器无法解码位置 Y 的字节 X:字符映射到 <undefined>
【发布时间】:2019-06-01 23:17:52
【问题描述】:

我正在尝试让 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 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>`  

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 酷,我尝试在 Python 3.4 中运行的一些 Python 2.7 代码遇到了这个问题。 Latin-1 对我有用!
  • 如果您使用的是 Python 2.7,并且遇到同样的错误,请尝试 io 模块:io.open(filename,encoding="utf8")
  • @1vand1ng0:Latin-1 当然可以;无论文件的实际编码是什么,它都适用于任何文件。这是因为文件中所有 256 个可能的字节值都有一个 Latin-1 代码点要映射到,但这并不意味着您可以获得清晰的结果!如果您不知道编码,即使以二进制模式打开文件也可能比假设 Latin-1 更好。
  • 默认是unicode,但unicode不是编码。 regebro.wordpress.com/2011/03/23/…
  • filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text) 即使在使用它之后我也遇到了同样的错误。我也尝试过其他编码,但都是徒劳的。在这段代码中,我也使用from geotext import GeoText。请提出解决方案。
【解决方案2】:

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

【讨论】:

  • 非常感谢 - 我会试一试。我不关心的部分文件中有一些无效字符。
  • 警告:遇到未知字符时会导致数据丢失(根据您的情况可能没问题)。
  • 建议的编码字符串应该有一个破折号,因此应该是:open(csv_file, encoding='utf-8')(在 Python3 上测试过)
【解决方案3】:

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

open(filename, 'rb')

其中 r = 阅读b = 二进制

【讨论】:

    【解决方案4】:

    作为@LennartRegebro's answer的扩展:

    如果您不知道您的文件使用什么编码并且上面的解决方案不起作用(它不是utf8)并且您发现自己只是在猜测 - 您可以使用online tools 来识别这是什么编码.它们并不完美,但通常工作得很好。弄清楚编码后,您应该可以使用上面的解决方案。

    编辑:(从评论中复制)

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

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

    1. 在底部的字段中输入view.encoding() 并希望一切顺利(除了Undefined,我什么也得不到,但也许你会有更好的运气...)

    【讨论】:

    • 一些文本编辑器也会提供此信息。我知道使用 vim 你可以通过:set fileencoding (from this link) 得到这个
    • Sublime Text,同样——打开控制台并输入view.encoding()
    • 或者,您可以使用记事本打开文件。 “另存为”,您将看到一个包含所用编码的下拉列表
    【解决方案5】:

    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】:

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

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

      神速

      【讨论】:

      • 好的,先生。收到。没有浪费时间。谢谢你。您想要一杯咖啡还是一杯美酒?
      • 在应用之前,请确保您希望将 0x90 解码为 'É'。检查b'\x90'.decode('cp437')
      【解决方案7】:

      对于那些在 Windows 中使用 Anaconda 的人,我遇到了同样的问题。记事本++帮我解决。

      在记事本++中打开文件。在右下角它会告诉你当前的文件编码。 在顶部菜单中,在“查看”旁边找到“编码”。在“编码”中转到“字符集”,然后耐心地寻找您需要的编码。在我的例子中,编码“Windows-1252”是在“西欧”下找到的

      【讨论】:

      • 这种方式只改变了查看编码。为了有效地更改文件的编码,请在 Notepad++ 中更改首选项并创建一个新文档,如下所示:superuser.com/questions/1184299/…
      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        对我来说,使用 utf16 编码工作

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

        【讨论】:

          【解决方案10】:

          在较新版本的 Python(从 3.7 开始)中,您可以添加解释器选项 -Xutf8,它应该可以解决您的问题。如果您使用 Pycharm,只需 运行 > 编辑配置(在标签配置中将字段 解释器选项中的值更改为-Xutf8)。

          或者,等效地,您可以将环境变量 PYTHONUTF8 设置为 1。

          【讨论】:

            【解决方案11】:

            对我来说,像我的代码一样更改 Mysql 字符编码有助于理清解决方案。 `照片=打开('pic3.png',编码=拉丁1), 强文本

            【讨论】:

              猜你喜欢
              • 2012-03-03
              • 2022-09-29
              • 1970-01-01
              • 2018-09-13
              • 2017-08-12
              • 2019-10-20
              • 2017-02-06
              相关资源
              最近更新 更多