web-dev-qa-db-fra.com

Comment lire un fichier octet par octet en Python et comment imprimer un bytelist en binaire?

J'essaie de lire un fichier octet par octet, mais je ne sais pas comment faire. J'essaie de le faire comme ça:

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

Cela signifie-t-il que l'octet variable contient 8 bits suivants au début de chaque boucle? Peu importe ce que sont réellement ces octets. La seule chose qui compte est que je dois lire un fichier en piles 8 bits.

MODIFIER:

De plus, je rassemble ces octets dans une liste et je voudrais les imprimer pour qu’ils ne soient pas imprimés sous forme de caractères ASCII, mais sous la forme d’octets bruts, c.-à-d.

['10010101', '00011100', .... ]
23
zaplec

Pour répondre à la deuxième partie de votre question, pour convertir en binaire, vous pouvez utiliser une chaîne de caractères format et la fonction ord :

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

Notez que les pastilles de format avec le bon nombre de zéros, ce qui semble être votre exigence. Cette méthode nécessite Python 2.6 ou une version ultérieure.

19
Scott Griffiths

Pour lire un octet:

file.read(1)

8 bits est un octet.

35
Mark Byers

Le code que vous avez montré lira 8 octets . Vous pourriez utiliser

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

Il existe un module python spécialement conçu pour lire et écrire des données codées binaires et appelé à partir de données codées binaires appelé ' struct ' . Les versions de Python sous 2.6 ne supportant pas str.format, une méthode custom nécessite à utiliser pour créer des chaînes au format binaire.

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
2
Owen Champion

En retard pour la fête, mais cela peut aider tous ceux qui recherchent une solution rapide:

vous pouvez utiliser bin(ord('b')).replace('b', '')bin (), il vous donne la représentation binaire avec un 'b' après le dernier bit, vous devez le supprimer. De plus, ord () vous attribue le numéro ASCII au caractère ou au caractère codé sur 8 octets/1 octet.

À votre santé

0
e-nouri