Python3阻塞CP-1252/ANSI阅读
-
17-09-2020 - |
题
我正在研究一系列解析器,在那里我从我的单元测试中得到了一堆traceback,比如:
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()打开,没有额外的arguemnts。我可以传递额外的参数来open()或使用codec模块中的某些内容以不同的方式打开这些?
这产生了用Python2编写并使用2to3工具转换为3的代码。
更新资料:事实证明,这是将zipfile输入解析器的结果。单元测试实际上预计会发生这种情况。解析器应该将其识别为无法解析的东西。所以,我需要改变我的异常处理。在现在这样做的过程中。
解决方案
位置0x81在Windows-1252(又名cp1252)中未分配。它被分配给拉丁文-1(又名ISO8859-1)中的U+0081高八位字节预置(HOP)控制字符。我可以像这样在Python3.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
现在把这个文件当作拉丁文-1,你通过 encoding
争论,就像codeape建议的那样:
>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
请注意,Windows-1257和Latin-1编码之间存在差异,例如Latin-1没有"智能报价"。如果您正在处理的文件是文本文件,请问问自己\x81在其中做了什么。
其他提示
可以放宽错误处理。
例如:
f = open(filename, encoding="...", errors="replace")
.
或:
f = open(filename, encoding="...", errors="ignore")
.
请参阅 docs 。
编辑:
但你确定问题是在阅读文件吗?它可能是在写入控制台的情况下发生异常吗?检查 http://wiki.python.org/moin/printfails
所有文件都是"不是Unicode"。Unicode是必须编码的内部表示。您需要为每个文件确定使用了什么编码,并在打开文件时指定必要的编码。
如跟踪和错误消息所示, 有问题的文件没有编码在 cp1252
.
如果它被编码在 latin1
,的 "\x81"
它正在抱怨的是一个甚至没有名称(在Unicode中)的C1控制字符。 考虑一下 latin1
极不可能有效。
你说"有些文件是用xml解析的。多姆。minidom"--解析成功还是失败?
一个有效的XML文件应该在第一行中声明其编码(默认为UTF-8),并且您不应该需要在代码中指定编码。向我们展示您用于执行xml的代码。多姆。minidom解析。
"其他人直接阅读为iterables"--示例代码请。
建议:尝试在浏览器中打开每种类型的文件。然后单击查看并单击字符编码(Firefox)或编码(Internet Explorer)。浏览器猜到了什么编码[通常可靠]?
其他可能的编码线索:文件中的文本中使用了哪些语言?你从哪儿弄来的文件?
注:请用澄清的信息编辑你的问题;不要在评论中回答。