如何在Python中读入文件的二进制文件

时间:2011-10-05 14:46:40

标签: python binary

在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 个答案:

答案 0 :(得分:6)

那是二进制文件。它们存储为字节,当您打印它们时,它们被解释为ASCII字符。

您可以使用the bin() functionthe ord() function查看实际的二进制代码。

for value in enumerate(data):
   print bin(ord(value))

答案 1 :(得分: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()

传递给'b'的{​​{1}}标志不会告诉Python有关如何表示文件内容的任何信息。来自the docs

  

将“b”附加到模式以在二进制模式下打开文件,在区分二进制文件和文本文件的系统上;在没有这种区别的系统上,添加'b'没有效果。

除非您只想查看文件中的二进制数据是什么样的,否则Mark Pilgrim的书“Dive Into Python”有an example处理二进制文件格式。示例显示如何从MP3文件中读取IDv1标签。这本书的网站似乎已经关闭了,所以我正在连接镜子。

答案 2 :(得分:3)

字符串中的每个字符都是二进制字节的ASCII表示。如果你想把它作为一个0和1的字符串,那么你可以将每个字节转换为一个整数,将其格式化为8个二进制数字并将所有内容连接在一起:

>>> s = "hello world"
>>> ''.join("{0:08b}".format(ord(x)) for x in s)
'0110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

根据您是否真的需要在二进制级别分析/操作事物,外部模块(如bitstring)可能会有所帮助。查看docs;只是得到二进制解释:

>>> f = open('somefile', 'rb')
>>> b = bitstring.Bits(f)
>>> b.bin
0100100101001001...

答案 3 :(得分:0)

使用ord(x)获取每个字节的整数值。

>>> with open('settings.dat', 'rb') as file:
...     data = file.read()
...
>>> for index, value in enumerate(data):
...     print '0x%08x 0x%02x' % (index, ord(value))
...
0x00000000 0x28
0x00000001 0x64
0x00000002 0x70
0x00000003 0x30
0x00000004 0x0d
0x00000005 0x0a
0x00000006 0x53
0x00000007 0x27
0x00000008 0x4d
0x00000009 0x41
0x0000000a 0x49
0x0000000b 0x4e
0x0000000c 0x5f
0x0000000d 0x57
0x0000000e 0x49
0x0000000f 0x4e

答案 4 :(得分:-2)

如果您真的想将binaray字节转换为位流,则必须从bin()的输出中删除前两个字符('0b')并反转结果:

with open("settings.dat", "rb") as fp:
    print "".join( (bin(ord(c))[2:][::-1]).ljust(8,"0") for c in fp.read() )

如果使用2.6之前的Python,则没有bin()函数。