将二进制文件转换为列表(Python)

3
我希望能够打开一个二进制文件,并创建一个包含所有字符的列表(一种数组),例如:"\x21\x23\x22\x21\x22\x31" 转换为 ["\x21","\x23","\x22","\x21","\x22","\x31"]。请问最好的解决方案是什么?
谢谢!
4个回答

4

您需要了解"\x21"和"!"是表示同一事物的两种方式

因此"\x21\x23\x22\x21\x22\x31"'!#"!"1'相同。

>>> "\x21\x23\x22\x21\x22\x31"  == '!#"!"1'
True

>>> infile = open('infile.txt', 'rb')
>>> list(infile.read())
['!', '#', '"', '!', '"', '1']
>>> ['!', '#', '"', '!', '"', '1'] == ["\x21","\x23","\x22","\x21","\x22","\x31"]
True

所以你可以看到它们是同一件事,但Python总是试图选择最用户友好的方式来显示字符。

2

您可以像读取文本数据一样读取二进制数据到字符串中,只需确保以二进制模式打开文件(在调用open()时使用b标志):

with open('file.bin', 'rb') as f:
   data = f.read()

data现在包含文件中的字符作为字符串,例如"\x21\x23\x22\x21\x22\x31"


1
假设myfile.txt文件中有'abcdef\n'...
>>> fh = open('myfile.txt', 'rb')
>>> list(fh.read())
['a', 'b', 'c', 'd', 'e', 'f', '\n']

1
要创建一个"一种数组"的字符,使用Python标准库array模块是一种非常高效的方式(比使用列表更好!)。
res = array.array('c')
with open('binaryfile', 'rb') as f:
    while True:
        try: res.fromfile(f, 1024 * 1024)
        except EOFError: break

该程序每次最多读取一兆字节(即 1024 * 1024),但会一直执行直到文件全部读取完毕 -- 当然您也可以根据需求调整该行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接