¿Cómo leer un byte a byte de un archivo en Python y cómo imprimir un bytelist como binario?

Estoy intentando leer un byte a byte de archivo, pero no estoy seguro de cómo hacerlo. Estoy tratando de hacerlo así:

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

Entonces, ¿eso hace que el byte variable contenga los 8 bits siguientes al comienzo de cada bucle? No importa cuáles sean esos bytes realmente. Lo único que importa es que necesito leer un archivo en stacks de 8 bits.

EDITAR:

También colecciono esos bytes en una lista y me gustaría imprimirlos para que no se impriman como caracteres ASCII, sino como bytes en bruto, es decir, cuando imprimo ese bytelist da el resultado como

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

Para responder la segunda parte de su pregunta, para convertir a binario puede usar una cadena de formato y la función ord :

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

Tenga en cuenta que el formato se rellena con el número correcto de ceros iniciales, lo que parece ser su requisito. Este método necesita Python 2.6 o posterior.

Para leer un byte:

 file.read(1) 

8 bits es un byte.

El código que has mostrado leerá 8 bytes . Usted podría usar

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

Hay un módulo de Python especialmente diseñado para leer y escribir desde y hacia datos codificados en binario llamado ‘ struct ‘. Dado que las versiones de Python en la versión 2.6 no son compatibles con str.format, se debe usar un método personalizado para crear cadenas con formato binario.

 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 

Tarde en la fiesta, pero esto puede ayudar a cualquiera que busque una solución rápida:

puede usar bin(ord('b')).replace('b', '') bin () le da la representación binaria con una ‘b’ después del último bit, debe eliminarlo. También ord () le da el número ASCII al carácter codificado de char o de 8 bits / 1 byte.

Aclamaciones