首页 > 解决方案 > 为什么在使用 python 读取文件的过程中会出现 unicode 编码错误?

问题描述

我正在尝试制作一个程序来读取txt文件中读取“hwlog read”的每一行,并且它运行良好,直到文件中间,它返回

(return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2856: character maps to undefined)

读取程序的代码部分是

with open(name, "r") as f:
    print("DEBUG")
    for line in f:
        if len(line.split()) == 5:
            if line.split()[-2] == "hwlog" and line.split()[-1] == "read":
                 input(line)

前几次,它工作正常

lhsh BXP_1024 hwlog read
lhsh BXP_1024_1 hwlog read
lhsh BXP_1024_2 hwlog read
lhsh BXP_1025 hwlog read
lhsh BXP_1025_4 hwlog read
lhsh BXP_1025_5 hwlog read
lhsh BXP_2048 hwlog read
lhsh BXP_2049 hwlog read
lhsh BXP_2050 hwlog read
lhsh BXP_2051 hwlog read
lhsh BXP_2052 hwlog read

但是在第 240070 行之后,它会返回之前的错误。我尝试将文件重新转换为 UTF-8,甚至尝试重新安装 python 并在其他设备上尝试,但它继续发生。为什么会发生这种情况,我该如何解决这个问题?

标签: pythonpython-3.xunicode

解决方案


您的文件中包含非 ASCII 字符。Python 3 将使用操作系统中配置的默认编码打开文件,如果您encoding在打开文本文件时没有明确参数 - 在这种特殊情况下,我无法告诉你它是什么编码 - 它不是 utf-8 或latin1,因为一个会给出不同的错误消息(“无效的起始字节”),另一个不会因 0x81 而失败。

使用 latin1 可能会在没有 UnicodeDecodeException 的情况下读取您的文件 - 但是,您的数据仍然会被破坏 - 因为“0x81”在 Latin1 中不是有意义的字符- 所以首先尝试找出文件的文本编码。

如果当我谈论“发现文件的编码是什么”时感觉模棱两可,我强烈建议您在继续任何任务之前立即阅读这篇文章。

现在,尝试猜测“\x81”本身在 utf-8 中没有意义,它可能是编码为 b“\xc3\x81”的 'Á' 字符的第二个字节。

因此,您可以尝试一下 - 只需将您的文件打开行更改为:

with open(name, "r", encoding="utf-8") as f:

如果它没有产生错误,那么文件是 utf-8,因为值 > 127 的字节必须有一个有意义的序列,不会偶然遇到。

否则,只需将编码设置为“latin-1” - 它执行从字节到 unicode 代码点的透明转换,但请注意您正在将mojibake插入数据中。


推荐阅读