如何在Python中逐字节读取文件以及如何将bytelist打印为二进制文件?

时间:2010-05-20 09:14:58

标签: python file-io byte

我正在尝试逐字节读取文件,但我不知道该怎么做。我试着这样做:

file = open(filename, 'rb')
while 1:
   byte = file.read(8)
   # Do something...

那么这会使变量字节在每个循环开始时包含8个下一位吗?这些字节究竟是什么并不重要。唯一重要的是我需要读取8位堆栈中的文件。

编辑:

此外,我在列表中收集这些字节,我想打印它们,以便它们不会打印为ASCII字符,而是作为原始字节打印,即当我打印该字符时,它会将结果显示为

['10010101', '00011100', .... ]

5 个答案:

答案 0 :(得分:35)

读取一个字节:

file.read(1)

8位是一个字节。

答案 1 :(得分:19)

要回答问题的第二部分,要转换为二进制文件,您可以使用format stringord函数:

>>> byte = 'a'
>>> '{0:08b}'.format(ord(byte))
'01100001'

请注意,格式会填充正确数量的前导零,这似乎是您的要求。此方法需要Python 2.6或更高版本。

答案 2 :(得分:15)

您显示的代码将读取8 字节。你可以用

with open(filename, 'rb') as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      ...

答案 3 :(得分:2)

有一个python模块,专门用于读取和写入称为“struct”的二进制编码数据。 由于2.6下的Python版本不支持str.format,因此需要使用custom method来创建二进制格式化的字符串。

import struct

# binary string
def bstr(n): # n in range 0-255
    return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])

# read file into an array of binary formatted strings.
def read_binary(path):
    f = open(path,'rb')
    binlist = []
    while True:
        bin = struct.unpack('B',f.read(1))[0] # B stands for unsigned char (8 bits)
        if not bin:
            break
        strBin = bstr(bin)
        binlist.append(strBin)
    return binlist

答案 4 :(得分:0)

晚会,但这可能有助于任何寻求快速解决方案的人:

您可以使用bin(ord('b')).replace('b', '') bin()它为您提供带有' b'的二进制表示。在最后一点之后,你必须删除它。此外,ord()为您提供了char或8位/ 1字节编码字符的ASCII编号。

干杯