Python 3扼流CP-1252/ANSI读取

Aar*_*man 5 python unicode cp1252 latin1 python-3.x

我正在研究一系列解析器,我从单元测试中得到一堆回溯,如:

  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>
Run Code Online (Sandbox Code Playgroud)

使用open()打开文件,没有额外的arguemnts.我可以将额外的参数传递给open()或者在编解码器模块中使用某些东西以不同方式打开它们吗?

这提出了用Python 2编写并使用2to3工具转换为3的代码.

更新:事实证明这是将zipfile输入解析器的结果.单元测试实际上预计会发生这种情况.解析器应该将其识别为无法解析的内容.所以,我需要改变我的异常处理.在这样做的过程中.

Mar*_*nas 14

位置0x81在Windows-1252(aka 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>
Run Code Online (Sandbox Code Playgroud)

或者使用实际文件:

>>> 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
Run Code Online (Sandbox Code Playgroud)

现在将此文件视为Latin-1,您传递encoding参数,如codeape建议:

>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
Run Code Online (Sandbox Code Playgroud)

请注意,Windows-1257和Latin-1编码之间存在差异,例如Latin-1没有"智能引号".如果您正在处理的文件是文本文件,请问自己\ x81正在做什么.


cod*_*ape 5

您可以放松错误处理。

例如:

f = open(filename, encoding="...", errors="replace")
Run Code Online (Sandbox Code Playgroud)

或者:

f = open(filename, encoding="...", errors="ignore")
Run Code Online (Sandbox Code Playgroud)

请参阅文档

编辑:

但你确定问题出在读取文件上吗?是否是向控制台写入内容时发生异常?检查http://wiki.python.org/moin/PrintFails

  • -1“放松错误处理”,不知道什么被忽略或为什么被忽略——无意识的屠杀 (2认同)