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正在做什么.
您可以放松错误处理。
例如:
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
| 归档时间: |
|
| 查看次数: |
15846 次 |
| 最近记录: |