我正在尝试读取二进制文件并获得一个utf-8格式的标头。但是,文件的其余部分的字节值超过了十进制127,因此我无法将其转换为字符串。我必须将文本拆分为; (或0x3B),我无法让它工作。
with open("test_qifs_single_frame.qifs", "rb") as file:
data = file.read()
print(binascii.hexlify(data))
我也无法将其作为字符串读取,因为它告诉我无法将0x81解码为UTF-8。据我所知,它超出了ASCII范围。我该怎么做才能解决这个问题?
您可以逐字节读取文件,直到到达停止字符,然后解码您已读取的数据。
创建一些示例数据
>>> from random import randint
>>> header = 'Heaðer;'.encode('utf-8')
>>> bs = b''.join(bytes.fromhex('{:0>2x}'.format(randint(0, 255))) for _ in range(56))
>>> with open('test_qifs_single_frame.qifs', 'wb') as f:
... f.write(header + bs)
>>>
从文件中读取标题
>>> # Create a bytearray to hold the bytes that we read.
>>> ba = bytearray()
>>> import functools
>>> with open('test_qifs_single_frame.qifs', 'rb') as f:
... breader = functools.partial(f.read, 1)
... for b in iter(breader, b';'):
... ba += b
...
>>> ba
bytearray(b'Hea\xc3\xb0er')
>>> ba.decode('utf-8')
'Heaðer'
如果iter builtin传递了一个callable和一个值,它将调用callable,直到它返回值。在代码中,我们使用functools.partial创建一个函数,一次读取一个字节的文件,然后将其传递给iter
。