Python bytearray 忽略编码?

4 投票
2 回答
9747 浏览
提问于 2025-04-16 17:28

我有一段代码,它从一个字符串缓冲区(StringIO对象)读取二进制数据,然后试图把这些数据转换成一个bytearray对象。但是,当值大于127时,就会出现错误,因为ascii编码无法处理这样的值,即使我试图覆盖这个限制。

file = open(filename, 'r+b')
file.seek(offset)
chunk = file.read(length)
chunk = zlib.decompress(chunk)
chunk = StringIO(chunk)

d = bytearray(chunk.read(10), encoding="iso8859-1", errors="replace")

运行这段代码时,我得到了:

  d = bytearray(chunk.read(10), encoding="iso8859-1", errors="replace")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 3: ordinal not in range(128)

显然,240(十进制的0xf0)超出了ascii编码的范围,但我就是想明确设置编码。可它似乎并没有理会我的设置。

2 个回答

2

我不太确定问题出在哪里。

StringIO 是用来处理字符串的,不是用来处理二进制数据的。

如果你想获取一个表示整个文件内容的字节数组,可以使用:

with open ('filename', 'r') as file: bytes = bytearray (file.read () )

如果你只想获取文件中包含的 ASCII 字符的字符串,可以使用:

with open ('filename', 'r') as file: asciis = file.read ().decode ('ascii', 'ignore')

(如果你在 Windows 上运行,打开文件时可能需要使用二进制标志。)

9

当你把一个字符串转换成另一种编码时,如果这个字符串是 str 类型的,就认为它是 ASCII 编码;如果是 unicode 类型的,就认为它是 Unicode 编码。在创建 bytearray 时,只有在字符串是 unicode 的情况下,才需要指定 encoding 参数。其实你只要不指定编码,就能得到你想要的结果。

撰写回答