J'ai une liste d'octets sous forme d'entiers, ce qui ressemble à quelque chose comme
[120, 3, 255, 0, 100]
Comment puis-je écrire cette liste dans un fichier sous forme binaire?
Cela fonctionnerait-il?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
TypeError: argument 1 must be string or buffer, not list
.Réponses:
C'est exactement ce à quoi
bytearray
sert:Si vous utilisez Python 3.x, vous pouvez utiliser à la
bytes
place (et vous devriez probablement le faire, car cela signale mieux votre intention). Mais en Python 2.x, cela ne fonctionnera pas, car cebytes
n'est qu'un alias pourstr
. Comme d'habitude, montrer avec l'interprète interactif est plus facile que d'expliquer avec du texte, alors laissez-moi faire cela.Python 3.x:
Python 2.x:
la source
str.encode
etstruct.pack
si vous devez travailler sur 2.2. Mais 2.6 est sorti depuis 5 ans maintenant; les trois Ubuntu LTS toujours pris en charge, les trois versions d'OS X prises en charge, la version majeure précédente de CentOS / RHEL, etc., sont tous livrés avec lui intégré. Si vous avez besoin de prendre en charge 2.5 ou 2.1 ou 1.6 ou autre, vous savoir…bytearray
convertissait toujours\n
en\r\n
, ce qui le rend insatisfaisant pour les données binaires, si l'indicateur "b" n'est pas passé lors de l'ouverture du fichier.\r\n
fonctionnalité fait partie des options de retour à la ligne universelles pour le texte.)Utilisation
struct.pack
pour convertir les valeurs entières en octets binaires, puis écrivez les octets. Par exempleCependant, je ne donnerais jamais une
.txt
extension à un fichier binaire .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 pouvez utiliser
'5i'
le format à la place pour obtenir des entiers 32 bits complets.la source
Pour convertir des entiers <256 en binaire, utilisez la
chr
fonction. Vous envisagez donc de faire ce qui suit.la source
charmap
plutôt queascii
, et fonctionne aussi bien en python2 qu'en python3. L'ascii
encodage ne fonctionne qu'en python2.À partir de Python 3.2+, vous pouvez également accomplir cela en utilisant la
to_bytes
méthode native int: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èrebyte
. Vous pouvez également raccourcir les deux dernières lignes en une seule:la source
Vous pouvez utiliser l'exemple de code suivant à l'aide de la syntaxe Python 3:
Voici la coque one-liner:
la source
Utilisez pickle, comme ceci: import pickle
Votre code ressemblerait à ceci:
Pour relire les données, utilisez la méthode pickle.load
la source