Maison >développement back-end >Tutoriel Python >Un moyen simple de lire et d'écrire des fichiers binaires en utilisant Python
Le sentiment général est que python lui-même ne prend pas en charge le binaire, mais il fournit un module pour compenser, qui est le module struct.
Python n'a pas de type binaire, mais il peut stocker des données binaires, c'est-à-dire utiliser le type chaîne pour stocker des données binaires. Cela n'a pas d'importance, car la chaîne est basée sur 1 octet.
import struct
a=12.34
#Convertir un en binaire
bytes=struct.pack('i',a)
À l'heure actuelle, bytes est une chaîne de caractères, et la chaîne est la même que le contenu de stockage binaire d'un in bytes.
Effectuez ensuite l'opération inverse
octets de données binaires existants (en fait une chaîne) et reconvertissez-les en type de données python :
a,=struct .unpack ('i',bytes)
Notez que unpack renvoie un tuple
, donc s'il n'y a qu'une seule variable :
bytes=struct.pack('i' ,a )
Ensuite, lors du décodage, vous devez faire ceci
a,=struct.unpack('i',bytes) ou (a,)=struct.unpack('i', bytes )
Si a=struct.unpack('i',bytes) est utilisé directement, alors a=(12.34,) est un tuple au lieu du nombre à virgule flottante d'origine.
S'il est composé de plusieurs données, cela peut ressembler à ceci :
a='hello' b='world!' c=2 d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)
Les octets à cet instant sont des données en binaire Nous pouvons écrire directement dans un fichier tel que binfile.write(bytes)
puis le lire quand nous en avons besoin, bytes=binfile.read()
puis le décoder. via struct.unpack() Dans la variable python
a,b,c,d=struct.unpack('5s6sif',bytes)
'5s6sif' Ceci s'appelle fmt, qui est un chaîne de format, composée de nombres et de caractères Composition, 5s représente une chaîne de 5 caractères, 2i représente 2 entiers, etc. Voici les caractères et types disponibles ctype représente une correspondance biunivoque avec les types en python.
Format | Type C | Python | Nombre d'octets | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x | octet de remplissage | aucune valeur | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c | char | chaîne de longueur 1 | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
b | caractère signé | entier | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B | caractère non signé | entier | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
? | _Bool | bool | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
h | court | entier | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
H | court non signé | entier | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
i | int | entier | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
I | entier non signé | entier ou long | 4 | tr>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l | long | entier | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L td> | long non signé | long | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
q | long long | long | 8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Q | long long non signé | long | 8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
f | flotteur | flotteur | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
d | double | flotteur | 8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
s | char[] | chaîne | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
p | char[] td> | chaîne | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
P | void * | long |
|
Le dernier peut être utilisé pour représenter le type de pointeur, occupant 4 octets
Afin d'être la même chose qu'en c Pour échanger des données avec des structures, vous devez également considérer que certains compilateurs c ou c utilisent l'alignement d'octets, généralement des systèmes 32 bits basés sur 4 octets, donc
Character | Byte order | Size and alignment |
---|---|---|
@ | native | native 凑够4个字节 |
= | native | standard 按原字节数 |
75a803047e7211490f6fad78c07d3c08 | big-endian | standard 按原字节数 |
! | network (= big-endian) | standard 按原字节数 |
La méthode d'utilisation est de le mettre en première position de fmt, tout comme '@5s6sif'
-----Problèmes rencontrés lors du traitement des fichiers binaires--- --
Lorsque nous traitons des fichiers binaires, nous devons utiliser la méthode suivante
binfile=open(filepath,'rb') pour lire les fichiers binaires
ou
binfile=open(filepath,'wb') Écrire un fichier binaire
Alors, quelle est la différence entre les résultats de binfile=open(filepath,'r') et binfile=open(filepath,' r') ?
Il y a deux différences :
Premièrement, si vous rencontrez '0x1A' lors de l'utilisation de 'r', il sera considéré comme la fin du fichier, qui est EOF. L'utilisation de « rb » ne pose pas ce problème. Autrement dit, si vous écrivez en binaire et lisez en texte, seule une partie du fichier sera lue si « 0X1A » est présent. Lorsque vous utilisez « rb », il lira jusqu'à la fin du fichier.
Deuxièmement, pour la chaîne x='abc/ndef', nous pouvons utiliser len(x) pour que sa longueur soit de 7. /n est appelé un caractère de nouvelle ligne, qui est en fait '0X0A'. Lorsque nous écrivons en « w », qui est le mode texte, « 0X0A » sera automatiquement transformé en deux caractères « 0X0D », « 0X0A » sur la plate-forme Windows, c'est-à-dire que la longueur du fichier devient en réalité 8. Lors de la lecture en mode texte 'r', il est automatiquement converti en caractère de nouvelle ligne d'origine. Si vous passez en mode binaire 'wb' pour écrire, un caractère restera inchangé et il sera lu tel quel lors de la lecture. Donc si vous écrivez en mode texte et lisez en mode binaire, vous devez prendre en compte cet octet supplémentaire. « 0X0D » est également appelé caractère de retour chariot.
Cela ne changera pas sous Linux. Parce que Linux utilise uniquement « 0X0A » pour représenter les sauts de ligne.
La méthode simple ci-dessus (recommandée) pour lire et écrire des fichiers binaires à l'aide de Python est tout le contenu partagé par l'éditeur. J'espère qu'elle pourra vous donner une référence et j'espère que vous soutiendrez le site Web PHP chinois.
Pour plus d'articles sur les méthodes simples de lecture et d'écriture de fichiers binaires à l'aide de Python, veuillez faire attention au site Web PHP chinois !