Python 3在读取CP-1252/ANSI时出现错误。

11 浏览
0 Comments

Python 3在读取CP-1252/ANSI时出现错误。

我正在处理一系列解析器,从我的单元测试中获得了一堆回溯信息,如下所示:

  File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap'编解码器无法解码位置112处的字节0x81:字符映射到

这些文件是用open()打开的,没有额外的参数。我可以向open()传递额外的参数,或者在编解码器模块中使用其他方法来以不同的方式打开它们吗?

这是由于使用2to3工具将Python 2代码转换为Python 3时出现的问题。

更新:事实证明这是将zipfile传递给解析器的结果。单元测试实际上希望发生这种情况。解析器应该将其识别为无法解析的内容。所以,我需要更改我的异常处理。我现在正在进行这个过程。

0
0 Comments

Python 3 chokes on CP-1252/ANSI reading 这个问题的出现原因是文件没有使用Unicode编码。Unicode是一种内部表示形式,必须进行编码。在打开文件时,需要确定每个文件使用了什么编码,并在必要时指定编码。

解决方法是找出每个文件使用的编码,并在打开文件时指定该编码。

根据错误消息和回溯信息,可以看出所涉及的文件没有使用cp1252编码。

如果文件使用latin1编码,它所抱怨的"\x81"是一个没有名称的C1控制字符(在Unicode中)。考虑到latin1极不可能有效。

你说"一些文件使用xml.dom.minidom解析"——成功还是失败了?一个有效的XML文件应该在第一行声明其编码(默认为UTF-8),你不需要在代码中指定编码。请展示你用于进行xml.dom.minidom解析的代码。

"其他文件直接读取为可迭代对象"——请提供示例代码。

建议:尝试在浏览器中打开每种类型的文件。然后点击查看,并点击字符编码(Firefox)或编码(Internet Explorer)。浏览器猜测的编码是什么[通常可靠]?

其他可能的编码线索:文件中的文本使用了哪些语言?你从哪里获取这些文件?

注意:请编辑您的问题,提供更清楚的信息;不要在评论中回答。

这可能是一个DOS代码页,其中'\x81'通常是'ü'。

0
0 Comments

Python 3 chokes on CP-1252/ANSI reading

在Python 3中,对于CP-1252/ANSI编码的读取会出错。解决这个问题的方法是放宽错误处理。可以使用以下两种方式之一:

方式一:

f = open(filename, encoding="...", errors="replace")

方式二:

f = open(filename, encoding="...", errors="ignore")

具体可以参考官方文档:http://docs.python.org/py3k/library/functions.html#open

但是,你确定问题出现在读取文件时吗?可能是在将内容写入控制台时发生异常。可以参考http://wiki.python.org/moin/PrintFails来解决问题。

我尝试了上述两种方法,但结果都一样。在输出之前就会抛出错误。

有人提出了“放宽错误处理”,但没有给出忽略错误的具体信息和原因,这是一种盲目的砍掉代码的行为。

事实上,忽略编码错误是一种不良的做法,违反了Unicode标准。

可能出错的地方可能是在将内容写入控制台时。

非常感谢,这对我很有帮助。我遇到的情况是我的文本日志中偶尔包含二进制数据,我想要对它们进行正则表达式和处理。

0
0 Comments

Python 3在读取CP-1252/ANSI编码时出现问题的原因是,CP-1252编码中的位置0x81在Windows-1252中并未分配,而是在Latin-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 

或者使用实际文件:

>>> 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`在其中的含义是什么。

顺带一提,Latin-1编码有256个编码点都已经分配了,所以您永远不会遇到UnicodeDecodeError。但是您可能会破坏数据。

0