Maison >développement back-end >Tutoriel Python >Un moyen simple de lire et d'écrire des fichiers binaires en utilisant Python

Un moyen simple de lire et d'écrire des fichiers binaires en utilisant Python

高洛峰
高洛峰original
2017-02-23 11:22:323027parcourir

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.


tr>
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
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
Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or long 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn