Lire et écrire des fichiers binaires en Python

Vous devez lire ou écrire des données binaires, telles que celles trouvées dans les images, les fichiers son, etc.

Utilisez la fonction open() avec le mode rb ou wb pour lire ou écrire des données binaires. Par exemple:

# Lire le fichier entier sous la forme d'une seule chaîne d'octets
with open('fichier.bin', 'rb') as f:
   donnees = f.read()

# Ecrire des données binaires dans un fichier
with open('fichier.bin', 'wb') as f:
   f.write(b'Python est amusant')

 

En lisant un fichier binaire, il est important de souligner que toutes les données retournées seront sous la forme de chaînes d’octets, et non de chaînes de texte.

De même, lors de l’écriture, vous devez fournir des données sous la forme d’objets qui exposent les données sous forme d’octets (par exemple, chaînes d’octets, objets bytearray, etc.).

Lors de la lecture de données binaires, les différences sémantiques subtiles entre les chaînes d’octets et les chaînes de texte constituent un danger potentiel.

En particulier, sachez que l’indexation et l’itération renvoient des valeurs d’octets entiers au lieu de chaînes d’octets. Par exemple:

>>> # Chaîne de texte
>>> t = 'Python est amusant'
>>> t[0]
'P'
>>> for c in t:
... print(c)
...
P
y
t
h
o
n
 
e
s
t
 
a
m
u
s
a
n
t

>>> # Chaîne d'octet
>>> b = b'Hello'
>>> b[0]
72
>>> for c in b:
... print(c)
...
72
101
108
108
111
...

>>>

 

Si vous avez besoin de lire ou d’écrire du texte à partir d’un fichier en mode binaire, n’oubliez pas de le décoder ou de l’encoder. Par exemple:

with open('fichier.bin', 'rb') as f:
   donnees = f.read(16)
   texte = donnees.decode('utf-8')

with open('fichier.bin', 'wb') as f:
   texte = 'Python est amusant'
   f.write(texte.encode('utf-8'))

 

Un aspect moins connu des E/S binaires est que les objets tels que les tableaux et les structures C peuvent être utilisés pour écrire sans aucune conversion intermédiaire en octets. Par exemple:

import array
nums = array.array('i', [1, 2, 3, 4])
with open('fichier.bin','wb') as f:
   f.write(nums)

 

Ceci s’applique à tout objet qui implémente la soi-disant “interface tampon”, qui expose directement une mémoire tampon sous-jacente à des opérations qui peuvent fonctionner avec elle. L’écriture de données binaires est l’une de ces opérations.

Beaucoup d’objets permettent également aux données binaires d’être directement lues dans leur mémoire sous-jacente en utilisant la méthode readinto() des fichiers. Par exemple:

>>> import array
>>> a = array.array('i', [0, 0, 0, 0, 0, 0, 0, 0])
>>> with open('fichier.bin', 'rb') as f:
... 	f.readinto(a)
...
16
>>> a
array('i', [1, 2, 3, 4, 0, 0, 0, 0])
>>>

 

Cependant, il faut faire très attention lors de l’utilisation de cette technique, car elle est souvent spécifique à la plate-forme en cours et peut dépendre de facteurs tels que la taille des mots et l’ordre des octets (c.-à-d., big endian contre little endian).

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here