我正在研究一系列解析器,在那里我从我的单元测试中得到了一堆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)。浏览器猜到了什么编码[通常可靠]?

其他可能的编码线索:文件中的文本中使用了哪些语言?你从哪儿弄来的文件?

注:请用澄清的信息编辑你的问题;不要在评论中回答。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top