在Windows-1252(aka cp1252)中未分配位置0x81。它在Latin-1(aka 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在其中执行的操作。