【发布时间】:2011-01-30 14:39:23
【问题描述】:
我希望能够打开一个二进制文件,并制作一个包含所有字符的列表(一种数组),例如:"\x21\x23\x22\x21\x22\x31" to [" \x21","\x23","\x22","\x21","\x22","\x31"] 转换它的最佳解决方案是什么?
谢谢!
【问题讨论】:
我希望能够打开一个二进制文件,并制作一个包含所有字符的列表(一种数组),例如:"\x21\x23\x22\x21\x22\x31" to [" \x21","\x23","\x22","\x21","\x22","\x31"] 转换它的最佳解决方案是什么?
谢谢!
【问题讨论】:
您需要了解“\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 总是试图选择最用户友好的方式来显示字符
【讨论】:
您可以像处理文本数据一样将二进制数据读入字符串,只需确保以二进制模式打开文件(调用open() 中的b 标志):
with open('file.bin', 'rb') as f:
data = f.read()
data 现在包含文件中的字符作为字符串,例如"\x21\x23\x22\x21\x22\x31"。
【讨论】:
假设myfile.txt 里面有'abcdef\n'...
>>> fh = open('myfile.txt', 'rb')
>>> list(fh.read())
['a', 'b', 'c', 'd', 'e', 'f', '\n']
【讨论】:
要制作“一种数组”的字符,一种非常有效的方法(比使用列表更有效!)是使用 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),但会一直持续到文件全部完成 - 当然,您可以根据需要调整该行为。
【讨论】: