当前位置: 首页 > 面试题库 >

在CP-1252 / ANSI读取上的Python 3扼流圈

李意致
2023-03-14
问题内容

我正在处理一系列解析器,在这些解析器中,我的单元测试中有很多回溯,例如:

  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()打开文件,没有多余的争辩。我可以将额外的参数传递给open()还是使用编解码器模块中的某些内容以不同的方式打开这些参数?

这带来了用Python 2编写的代码,并使用2to3工具将其转换为3。

更新:事实证明,这是由于将zipfile输入解析器而导致的。单元测试实际上预计会发生这种情况。解析器应将其识别为无法解析的内容。因此,我需要更改异常处理。现在正在这样做。


问题答案:

在Windows-1252(aka cp1252)中未分配位置0x81。它在Latin-1(aka 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>

或带有实际文件:

>>> 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在其中执行的操作。



 类似资料:
  • 问题内容: 我有以下文件: 其中代表一个十六进制值为0x1A的字节。尝试以以下方式在Python中读取此文件时: 它仅读取前两行,并退出循环。 解决方案似乎是以二进制(或通用换行模式)打开文件-‘rb’或’rU’。你能解释这种行为吗? 问题答案: 0x1A是Ctrl-Z,而DOS在历史上一直将其用作文件结束标记。例如,尝试使用命令提示符,然后“键入”文件。它将仅在Ctrl-Z上显示内容。 Pyth

  • 我试图保存一个字符串在希伯来文文件,同时有文件ANSI编码。恐怕所有的尝试都失败了。 PHP文件本身是UTF-8 这是我正在尝试的代码: 由于某种原因,返回false。 另一次尝试是: 这返回一个空字符串。当这不起作用时,将输出字符集更改为Windows-1255的工作。所以函数本身工作,但由于某种原因,它不转换为1252。 我运行这个函数之前和之后的和打印的结果 在图标之前编码是UTF-8,在图

  • 问题内容: 请看下面的代码 我正在尝试读取CSV文件,在代码中编辑文本,然后将其写回到.txt文件中。我的问题是,我有葡萄牙语单词,因此应使用ANSI格式读写文件。现在,输出文件中的某些葡萄牙语单词已替换为符号。 如何在Java中以ANSI格式读取文本数据并将其写入文件? 问题答案: 要读取具有特定编码的文本文件,可以将FileInputStream结合使用InputStreamReader。Wi

  • 好的,正如标题所示,我的问题是正确地从python中的windows-1252编码文件中读取输入,并将所述输入插入SQLAlchemy MySql表。 当前系统设置: Windows 7虚拟机,带“罗杰访问控制系统”,输出文件 Ubuntu12.04 LTS虚拟机,带有Windows系统的共享文件夹,因此我可以使用“Python 2.7.3”访问该文件。 现在来看实际问题,对于输入文件,我有一个“

  • 嗨,我需要一些帮助/指导,因为我在研究中遇到了困难。 问题是: 如何在API(通过编程)或控制台版本中使用gstream er或avlib(ffmpeg)转换RTP数据。 数据 我有来自TCP上RTP/RTCP的RTP转储,因此我可以获得文件中每个RTP数据包的精确启动和停止。这是一个H264视频流转储。数据采用这种方式,因为我需要通过libcurl获取RTCP/RTP交织流(我目前正在这样做)