2010-05-20 11 views
21

Estoy tratando de leer un byte de archivo por byte, pero no estoy seguro de cómo hacerlo. Estoy tratando de hacerlo así:¿Cómo se lee un byte de archivo por byte en Python y cómo imprimir un bytelist como un binario?

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

Así hace eso el byte variable para contener 8 bits siguientes al inicio de cada bucle? No importa qué son realmente esos bytes. Lo único que importa es que necesito leer un archivo en pilas de 8 bits.

EDIT:

También me recoger esos bytes en una lista y me gustaría imprimirlos para que no se imprimen como caracteres ASCII, pero como prima bytes es decir, cuando imprimo que bytelist que da la como resultado

['10010101', '00011100', .... ] 
+4

Use 'while True:' en lugar de 'while 1:'. –

+0

Esta pregunta es muy similar a http://stackoverflow.com/questions/1035340/reading-binary-file-in-python. –

Respuesta

18

Para responder a la segunda parte de su pregunta, para convertir a binario se puede utilizar un format string y la función ord:

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

Tenga en cuenta que las pastillas de formato con el número correcto de ceros a la izquierda, que parece ser su requisito. Este método necesita Python 2.6 o posterior.

28

Para leer un byte:

file.read(1) 

8 bits es un byte.

+1

Gracias. Pensé que file.read (1) leería solo un bit, pero parece que lee un byte. – zaplec

14

El código que ha mostrado leerá 8 bytes. Se podría utilizar

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

Hay un módulo de python especialmente diseñado para leer y escribir desde y hacia datos codificados binarios llamados 'struct'. Como las versiones de Python en 2.6 no son compatibles con str.format, se necesita un custom method 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 
+1

Si solo lo está usando para un solo carácter, seguramente sería mejor usar 'ord (f.read (1))' en lugar de 'struct.unpack ('B', f.read (1)) [0] '? (Tendría que hacer algo como 'c = f.read (1); if not c: break; binlist.append (bstr (ord (c)))'.) –

0

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

puede utilizar bin(ord('b')).replace('b', '') bin() que siempre tenga la representación binaria con una 'b' después de que el último bit, tienes que eliminarlo También ord() le proporciona el número ASCII para el carácter de caracteres o código de 8 bits/1 byte.

Cheers

Cuestiones relacionadas