What does the position number mean in this UnicodeError : 'gbk' codec can't decode byte 0x91 in position 2196”

What does the position number mean in this UnicodeError : 'gbk' codec can't decode byte 0x91 in position 2196”

当我尝试操作数据时,我经常会想到它,例如 "UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2196: illegal multibyte sequence"。

我找到了绕过这个错误的方法,但我的好奇心驱使我调查 2196 位置的内容。

问题来了:

如何理解2196这个数字?我的意思是当我从 1,2,...,2196 开始计数时应该使用什么编码。 utf-8?国标?二进制?十六进制还是其他? 我怎样才能在不抛出错误的情况下看到那个位置的数字?

这里以代码部分为例:

with open(r"G:\ETCDataaMTC19-06-01.txt", "r") as fp:
    for i, line in enumerate(fp):
        if i == 6:
            pass

UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-2-6810d8c84b34> in <module>()
      1 with open(r"G:\ETCDataaMTC19-06-01.txt", "r") as fp:
----> 2     for i, line in enumerate(fp):
      3         if i == 6:
      4             pass

UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2196: illegal multibyte sequence

您需要在打开文件时指定正确的编码。尝试将此添加到 open 命令:

with open(r"G:\ETCDataaMTC19-06-01.txt", "r", encoding="utf-8") as fp:
    for i, line in enumerate(fp):
        if i == 6:
            pass

Re number 2196 - 它只是说它无法正确读取位置 2196 中的符号。它实际上是符号在该行开头的行中的位置。

要查看它,请检查错误期间 line 的值是什么,然后使用任何文本编辑器打开 txt 文件。找到直线并找到符号。

这里的问题是,解码函数是从 io 系统的内部调用的。 2196 是读取缓冲区中有问题的字节的位置。如果您的文件足够短,可以在单个块中读取,或者如果错误发生在第一个块上,那么它就是字节在文件中的位置。在任何其他情况下,将很难猜测字节在文件中的真实位置。

BTW b'\x91' 是 cp1252 字符集中的左单引号 unicode U+2018