如何在Python中读取文件的二进制数据
在Python中,当我用'rb'模式读取一个可执行文件时,我本来想得到一些二进制值,比如0010001之类的,但结果却得到了一堆我看不懂的字母和符号。
Ex: ???}????l?S??????V?d?\?hG???8?O=(A).e??????B??$????????: ???Z?C'???|lP@.\P?!??9KRI??{F?AB???5!qtWI??8???!ᢉ?]?zъeF?̀z??/?n??
我该如何在Python中访问一个文件的二进制数字呢?
如果有任何建议或帮助,我将非常感激。提前谢谢你们。
5 个回答
3
字符串中的每个字符都是一个二进制字节的ASCII表示。如果你想把它变成由零和一组成的字符串,可以把每个字节转换成整数,然后格式化成8位的二进制数字,最后把它们连接在一起:
>>> s = "hello world"
>>> ''.join("{0:08b}".format(ord(x)) for x in s)
'0110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
如果你真的需要在二进制层面上分析或处理数据,使用一个外部模块,比如bitstring,可能会很有帮助。可以查看一下文档;如果只是想获取二进制表示,可以使用类似下面的代码:
>>> f = open('somefile', 'rb')
>>> b = bitstring.Bits(f)
>>> b.bin
0100100101001001...
4
在Python中,字节序列是用字符串来表示的。当你打印出一个字节序列时,看到的一串字母和符号其实只是这些字节的可打印表示。为了更好地利用这些数据,通常需要对它进行一些处理,以获得更有用的表现形式。
你可以使用 ord(x)
或 bin(x)
来获取十进制和二进制的表示:
>>> f = open('/tmp/IMG_5982.JPG', 'rb')
>>> data = f.read(10)
>>> data
'\x00\x00II*\x00\x08\x00\x00\x00'
>>> data[2]
'I'
>>> ord(data[2])
73
>>> hex(ord(data[2]))
'0x49'
>>> bin(ord(data[2]))
'0b1001001'
>>> f.close()
你在调用 open()
时加上的 'b'
标志,并不会告诉Python如何表示文件的内容。根据文档:
在需要区分二进制文件和文本文件的系统中,向模式中添加 'b' 可以以二进制模式打开文件;而在不区分这两者的系统中,添加 'b' 是没有效果的。
除非你只是想看看文件中的二进制数据是什么样的,Mark Pilgrim的书《Dive Into Python》中有一个关于如何处理二进制文件格式的例子。这个例子展示了如何从MP3文件中读取IDv1标签。书的网站似乎无法访问,所以我提供了一个镜像链接。