178 votes

Python : comment écrire dans un fichier binaire ?

J'ai une liste d'octets sous forme d'entiers, ce qui donne quelque chose comme

[120, 3, 255, 0, 100]

Comment puis-je écrire cette liste dans un fichier en tant que binaire ?

Est-ce que ça marcherait ?

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)

177voto

abarnert Points 94246

C'est exactement ce que bytearray est pour :

newFileByteArray = bytearray(newFileBytes)
newFile.write(newFileByteArray)

Si vous utilisez Python 3.x, vous pouvez utiliser bytes à la place (et devrait probablement le faire, car cela signale mieux votre intention). Mais dans Python 2.x, cela ne fonctionnera pas, car bytes est juste un alias pour str . Comme d'habitude, il est plus facile de montrer avec l'interpréteur interactif que d'expliquer avec du texte, alors laissez-moi faire.

Python 3.x :

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
b'{\x03\xff\x00d'

Python 2.x :

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
'[123, 3, 255, 0, 100]'

41voto

Mark Ransom Points 132545

Utilice struct.pack pour convertir les valeurs entières en octets binaires, puis écrire les octets. Par exemple

newFile.write(struct.pack('5B', *newFileBytes))

Cependant, je ne donnerais jamais à un fichier binaire une valeur de .txt extension.

L'avantage de cette méthode est qu'elle fonctionne également pour d'autres types. Par exemple, si l'une des valeurs était supérieure à 255, vous pourriez utiliser la méthode suivante '5i' pour le format afin d'obtenir des entiers 32 bits complets.

17voto

Perkins Points 616

Pour convertir des entiers < 256 en binaire, utilisez la fonction chr fonction. Vous envisagez donc de faire ce qui suit.

newFileBytes=[123,3,255,0,100]
newfile=open(path,'wb')
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('charmap'))

17voto

CrepeGoat Points 893

À partir de Python 3.2+, vous pouvez également réaliser cette opération en utilisant la fonction to_bytes méthode native int :

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
for byte in newFileBytes:
    newFile.write(byte.to_bytes(1, byteorder='big'))

C'est-à-dire que chaque appel à to_bytes dans ce cas, crée une chaîne de longueur 1, avec ses caractères disposés dans l'ordre big-endian (ce qui est trivial pour les chaînes de longueur 1), qui représente la valeur entière byte . Vous pouvez également raccourcir les deux dernières lignes en une seule :

newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))

8voto

kenorb Points 2464

Vous pouvez utiliser l'exemple de code suivant en utilisant la syntaxe Python 3 :

from struct import pack
with open("foo.bin", "wb") as file:
  file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))

Voici la coquille d'un seul coup :

python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X