不理解 UnicodeDecodeError 错误消息中给定的字节和位置

Not understanding given byte and position in UnicodeDecodeError error message

提问人:PSt 提问时间:5/15/2023 更新时间:5/16/2023 访问量:68

问:

我有一个csv文件,如下所示:

Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;Thisisatext;
VESELÝ

所以这些正好是 40 行,包含一行“Thisisatext”,依此类推,最后一行的名称在 y 上有特殊重音。

我现在尝试使用以下python代码打开此文件:

import csv
myfile = r'S:\folder\myfile.csv'

with open(myfile) as infile: #,  encoding="utf-8-sig" # , encoding="cp1252"
        cr = csv.reader(infile, delimiter=";")
        for line in cr:
            print(line)

这不起作用并导致错误:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 57: character maps to <undefined>

事实上,原因是我应该使用编码 specifiyng utf-8-sig。错误消息来了,因为我的操作系统似乎标准是cp1252。当我尝试使用 cp1252 时,我收到同样的错误。当我尝试使用 utf-8-sig 时,它可以工作。由于带有重音的字符 y 包含在 utf 8 编码中,而似乎不在 cp1252 中。

当我在 notepad++ 中打开文件并将光标放在第 41 行中 Ý 所在的点时,它显示位置 8248。当我标记 Ý 并使用记事本++ 转换器将 ascii 转换为十六进制时,它显示:

ex1

python 错误消息说 。can't decode byte 0x9d in position 57

当我根据 notepad++ 删除一行(例如第一行)时,Ý 现在位于位置 8042。当我再次在新文件上运行代码时,收到错误消息:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 8043: character maps to <undefined>

所以现在的位置是 8043。正如(几乎)在记事本++中所说的那样。

我有两个问题:

第一个:为什么python错误消息提到字节0x9d?当我在记事本++中检查转换后的结果时,它看起来像图像C39D?所以 0x 告诉我 python 正在谈论十六进制,当我在这里检查 9d 时,它说:

“注:十进制 128-129 (0x80-81)、141-144 (0x8D-90) 和 157-158 (0x9D-9E) 是不可打印的字符。

但是为什么记事本++转换后的结果C39D呢?根据表,C3 将是 .î

一般来说,我认为可以添加到不同字符的重音 9D 是问题所在。但我不明白细节。

第二个:python为什么以及如何计算位置?显然,在第一种情况下存在很大的不匹配,当 python 说 .python 是怎么想出 57 的?当我删除一行时,它突然是正确的,但数字完全不同。似乎 python 分部分读取文件并给我在特定部分中的位置?是否有可能获得“真实”的正确位置?如果我有一个非常大的文件,并且无法手动搜索它,我该如何确定导致问题的标志的确切位置?'charmap' codec can't decode byte 0x9d in position 57

python csv 编码 utf-8

评论

0赞 MyICQ 5/15/2023
如本页所述,您从不同场景中获取哪些信息?您是否有相关实际文件的(最小)示例可在某处下载?

答:

1赞 deceze 5/15/2023 #1

首先,在处理 CP1252 时,查看扩展 ASCII 表无济于事。您可以在此处找到 CP1252 的表格:https://en.wikipedia.org/wiki/Windows-1252

为什么python错误消息提到字节?当我在记事本++中检查转换后的结果时,它看起来像在图像中,?0x9dC39D

是的,您的文件中有两个字节。 只是另一种表示法,以澄清它的意思是十六进制字节。在上下文中,应该理解它已经是十六进制表示法,而没有为每个字节重复“0x..”。所以指的是你的字节。C3 9D0x..C3 9D0x9d9D

C3是 CP1252 表中的映射代码,映射到字符“Ô。 但是,它映射到 CP1252 表中,并且没有任何意义,正如错误消息所述。9D

在 UTF-8 中,字节序列映射到字符“Ý”,正如预期的那样。C3 9D

python为什么以及如何计算位置?显然,在第一种情况下存在很大的不匹配,当 python 说 .'charmap' codec can't decode byte 0x9d in position 57

这可能意味着您最初在位置 57 处有另一个奇怪的字节,可能在第一行。如果删除它,Python 遇到的下一个“错误”就在位置 8043 处。

您可能对每个程序员绝对需要了解的关于编码和字符集以处理文本的内容感兴趣,以获取一些关于编码的入门知识。

评论

0赞 PSt 5/15/2023
感谢您的回答,但是关于位置 57 的另一个奇怪的字节:不,我也可以删除另一行,只有这一个字符会造成问题。所以事实并非如此。一定有另一个原因。
0赞 deceze 5/15/2023
然后,我们需要一个最小的可重复示例来诊断它。最好的办法是使用十六进制编辑器查看文件并检查位置 57。
0赞 PSt 5/15/2023
该文件与我在这里放置的完全一样,只需复制和粘贴并另存为 csv。
0赞 deceze 5/15/2023
不一定。复制和粘贴本网站在其处理过程中重新编码的字符将删除原始文件中可能存在的任何杂散的不可打印字节。
0赞 PSt 5/15/2023
不,我也手动复制了它。这是我的文件。
1赞 Mark Tolonen 5/16/2023 #2

对于第二个问题,如果在调试器中运行代码,则会看到代码返回异常(与异常不完全相同,但接近:

Traceback (most recent call last):
  File "C:\test.py", line 5, in <module>
    for line in cr:
  File "D:\dev\Python311\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 0x9d in position 54: character maps to <undefined>

在我的调试器中,的值为:input

[Dbg]>>> input
b'isisatext;Thisisatext;Thisisatext;Thisisatext;\r\nVESEL\xc3\x9d\r\n'
[Dbg]>>> hex(input[54])
'0x9d'

要点是偏移量位于正在读取的文件的当前块中,而不是整个文件中的偏移量。基于文件的大小略大于 8K,并且在删除行时偏移量更改为略小于 8K,因此可能会以 8K 块的形式读取文件。若要在文件中找到正确的位置,请一次读取所有位置,并将其解码为连续的数据 Blob:

>>> with open('myfile.csv', 'rb') as f:
...     data = f.read()
...     
>>> data.decode('cp1252')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "D:\dev\Python311\Lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 8246: character maps to <undefined>
>>> hex(data[8246])
'0x9d'

8246 是文件中字节0x9D的实际偏移量。

对于第一个问题,一起使 的多字节 UTF-8 编码为 。在 cp1252 中,解码为 but 未定义。如果解码到但不包括偏移量 8246,则它不会出错,这就是为什么它不包括:C3 9DÝC3Ã9D9D

>>> data[8240:8246].decode('cp1252')
'VESELÃ'

评论

0赞 deceze 5/16/2023
读取和解码的是底层的读取器,即使请求的是块状文件。我相当确定读者报告的位置是文件中的实际偏移量,而不是块。但我对此不是 100% 有信心。opencsv.reader
1赞 Mark Tolonen 5/16/2023
@deceze 我 100% 确信它是块中的偏移量,因为这正是调试器中缓冲区的内容。文件中的失败偏移量为 8246,减去 8192 (8K) 为 54...错误消息中的偏移量。
0赞 PSt 5/16/2023
@MarkTolonen 谢谢你!有趣。我在哪里可以读到有关块处理的更多信息,如果它真的是 8192?它记录在哪里?我的文件非常大,所以我对一次读取所有文件有点怀疑。因此,我希望为代码提供一个简单的解决方案,以某种方式将块大小乘以它中断的当前块数,然后以某种方式从中获取正确的位置。但是为此,我必须实现一个计数器来计算块的数量,例如“正在运行的 i”,可以说每次启动新块时都会增加 1。
0赞 Mark Tolonen 5/16/2023
@PSt查看 open缓冲参数。