【问题标题】:UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position XXX: charUnicodeDecodeError:“charmap”编解码器无法解码位置 XXX 中的字节 0x8f:char
【发布时间】:2017-06-20 12:31:45
【问题描述】:

我正在尝试从 python 脚本中读取一个日志文件。我的程序在 Linux 中运行良好,但在 Windows 中出现错误。在读取特定行号的某些行后,我收到以下错误

  File "C:\Python\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 0x8f in position 311: char
acter maps to <undefined> 

以下是我用来读取文件的代码

with open(log_file, 'r') as log_file_fh:
    for line in log_file_fh:
        print(line)

我尝试通过使用 ascii、utf8、utf-8、ISO-8859-1、cp1252、cp850 等不同的编码模式来修复它。 但仍然面临同样的问题。 有什么办法可以解决这个问题。

【问题讨论】:

  • 文件的编码是什么
  • 我不知道文件的编码。但我认为它的 ANSI 我已经看到了找出文件编码的一种方法是在记事本中打开文件并使用保存,因为我看到了 ANSI。
  • 我使用下面的链接找到了编码它的显示编码为西方codeftw.blogspot.in/2009/07/…
  • 所谓的ANSI编码是Windows-1252又名CP-1252。该错误消息表明您的 Windows 系统使用 CP-1252 作为默认编码,但您正在读取的文件 not CP-1252,因此无法将其解码为 Unicode。您需要指定文件的实际编码。在 Python 3 中,最简单的方法是在 open 调用中将编码作为参数传递。试试with open(log_file, 'r', encoding="utf-8") as log_file_fh:,让我们知道会发生什么。
  • 顺便说一句,对于 Unicode 问题,您应该总是提及您正在使用的 Python 版本(最好包含适当的标签),因为 Python 3 处理 Unicode 与 Python 2 完全不同。

标签: python python-3.x unicode


【解决方案1】:

我想通过python脚本读取的日志文件是用西方语言编码的。 我已经参考了以下链接 https://docs.python.org/2.4/lib/standard-encodings.html 我使用“cp850”作为编码模式,这对我有用

with open(log_file, 'r',encoding='cp850') as log_file_fh:
    for line in log_file_fh:
        print(line)

但是对于西欧,该网站上有很多编解码器可用。 我认为这不是正确的解决方案,因为 大多数开发人员建议不要使用“cp850”模式

处理编码错误的最佳方法是在打开文件时添加错误参数并将“忽略”作为属性。它将忽略我们无法解码的特殊字符。在我的情况下,这个选项是可以的,因为我没有'不想读取文件的全部内容。我只想要一些特定的日志。

with open(log_file, 'r',errors='ignore') as log_file_fh:
    for line in log_file_fh:
        print(line)

【讨论】:

  • 好吧,如果文件使用'cp850' 正确解码,那么您需要指定'cp850' 作为编码。但是,最好先修复创建日志文件的代码,以便使用'UTF-8' 编码而不是古老的'cp850'。如果您需要这方面的帮助,请不要修改此问题。相反,您需要创建一个新问题,使用 minimal reproducible example 向我们展示您是如何编写日志文件的。
  • 我的 python 脚本在 linux 和 windows10 中运行良好,但在 windows 7 中出现了我通过 'cp850' 解决的charmap 错误。我推荐了这个stackoverflow.com/questions/9233027/… 使用了'latin_1',一个也为我工作
  • 这听起来像Windows系统有不同的默认charmaps设置。但这确实是 Windows 配置问题,而不是 Python 编码问题。 cp850 和 cp1252 都与 Latin1(又名 ISO-8859-1)相关,但这些代码页中的某些字符与 Latin1 不同;有关详细信息,请参阅 Wikipedia 文章。由于这些相似之处,如果(例如)您尝试使用 Latin1 解码一个 cp850 文件,它可能看起来大部分时间都可以工作,但某些特殊字符可能是错误的。
  • 正如我之前所说,解决这种混乱的最佳方法是只使用 UTF-8。但是,在 Windows 机器上正确执行此操作可能会很棘手。
  • 我遇到了类似的问题,但我的问题被翻转了,因为我的系统试图读取具有不同编码的 utf-8 文件,并将编码指定为“utf-8”修复了它。 +1
【解决方案2】:

编辑: 按照建议以二进制模式打开文件:with open(log_file, 'rb')

然后在你的代码中解码 utf-8:

with open(log_file, 'r') as log_file_fh:
    for line in log_file_fh:
        line = line.decode('utf-8')
        print(line)

【讨论】:

  • @raginidahihande 此解决方案假定log_file 使用utf-8 编码,但要使其正常工作,您需要以二进制模式打开文件:with open(log_file, 'rb') .当然,即使你这样做,如果log_file 没有使用utf-8 编码,它也不会正常工作。
  • @PM2Ring 你能做出新的回答然后我删除我的
  • 只需修复您的答案以二进制模式打开文件,并提及它仅在文件为 UTF-8 时才有效。我还没有写答案,因为 Ragini 仍然没有告诉我们我在问题评论中的建议是否有效,所以我们不知道实际的编码是什么。但我同意 UTF-8 是一个合理的猜测。 :)
  • 我不想以二进制模式读取文件我想以文本模式读取它
  • @raginidahihande:你有两个选择。 1)以二进制模式打开文件,然后使用正确的编码将其解码为文本,如this answer所示。 2)以文本模式打开它,在open调用中指定正确的编码,如我的评论所示。任何一种方法都会产生相同的结果。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多