我正在研究一系列解析器,从中我从我的单元测试中得到一堆回溯,例如:
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 0x81 in position 112: character maps to <undefined>
文件是用 open() 打开的,没有额外的参数。我可以将额外的参数传递给 open() 或使用编解码器模块中的某些东西以不同方式打开这些参数吗?
这产生了用 Python 2 编写并使用 2to3 工具转换为 3 的代码。
更新:事实证明这是将 zip 文件输入解析器的结果。单元测试实际上期望这种情况发生。解析器应该将其识别为无法解析的内容。所以,我需要改变我的异常处理。现在正在这样做。
最佳答案
位置 0x81 在 Windows-1252(又名 cp1252)中未分配。它被分配给 Latin-1(又名 ISO 8859-1)中的 U+0081 HIGH OCTET PRESET (HOP) 控制字符。我可以像这样在 Python 3.1 中重现您的错误:
>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>
或使用实际文件:
>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte
现在要将此文件视为 Latin-1,您需要传递 encoding
参数,就像 codeape 建议的那样:
>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
请注意 Windows-1257 和 Latin-1 编码之间存在差异,例如Latin-1 没有“引号”。如果您正在处理的文件是文本文件,请问问自己\x81 在其中做什么。
关于Python 3 在 CP-1252/ANSI 读取时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284827/