Heim >Backend-Entwicklung >Python-Tutorial >Eine einfache Möglichkeit, Binärdateien mit Python zu lesen und zu schreiben
Der allgemeine Eindruck ist, dass Python selbst keine Binärdateien unterstützt, aber ein Modul bereitstellt, um dies auszugleichen, nämlich das Strukturmodul.
Python hat keinen Binärtyp, kann aber Daten vom Binärtyp speichern, d. h. den String-String-Typ zum Speichern von Binärdaten verwenden. Dies spielt keine Rolle, da der String auf 1 Byte basiert .
import struct
a=12.34
#Konvertieren Sie a in binär
bytes=struct.pack('i',a)
Zu diesem Zeitpunkt handelt es sich bei Bytes um eine Zeichenfolge, und die Zeichenfolge entspricht dem binären Speicherinhalt von a in Bytes.
Führen Sie dann den umgekehrten Vorgang aus
vorhandene binäre Datenbytes (eigentlich eine Zeichenfolge) und konvertieren Sie sie zurück in den Python-Datentyp:
a,=struct .unpack ('i',bytes)
Beachten Sie, dass unpack Tupel zurückgibt
, wenn also nur eine Variable vorhanden ist:
bytes=struct.pack('i' ,a )
Dann müssen Sie beim Dekodieren Folgendes tun:
a,=struct.unpack('i',bytes) oder (a,)=struct.unpack('i', Bytes )
Wenn a=struct.unpack('i',bytes) direkt verwendet wird, dann ist a=(12.34,) ein Tupel anstelle der ursprünglichen Gleitkommazahl.
Wenn es aus mehreren Daten besteht, kann es so aussehen:
a='hello' b='world!' c=2 d=45.123 bytes=struct.pack('5s6sif',a,b,c,d)
Die Bytes sind zu diesem Zeitpunkt binäre Daten Wir können direkt in eine Datei wie binfile.write(bytes)
schreiben und sie dann auslesen, wenn wir sie brauchen, bytes=binfile.read()
und sie dann dekodieren über struct.unpack() In die Python-Variable
a,b,c,d=struct.unpack('5s6sif',bytes)
'5s6sif' Dies wird als fmt bezeichnet, was a ist Formatieren Sie eine Zeichenfolge, die aus Zahlen und Zeichen besteht. 5s stellt eine Zeichenfolge mit 5 Zeichen dar, 2i stellt 2 ganze Zahlen dar usw. Im Folgenden sind die verfügbaren Zeichen und Typen aufgeführt. ctype stellt eine Eins-zu-Eins-Entsprechung mit den Typen in Python dar.
Format | C-Typ | Python | Anzahl der Bytes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x | Pad-Byte | kein Wert | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c | char | String der Länge 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 oder long | 4 | tr>||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
l | long | integer | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
L td> | 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[] td> | string | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
P | void * | long |
|
Der letzte kann zur Darstellung von Zeigertypen verwendet werden und belegt 4 Bytes
Um der zu sein wie in c Um Daten mit einer Struktur auszutauschen, sollten Sie auch berücksichtigen, dass einige C- oder C++-Compiler die Byte-Ausrichtung verwenden, bei der es sich normalerweise um ein 32-Bit-System handelt, das auf 4 Bytes basiert und daher auch
Die Verwendungsmethode besteht darin, es an die erste Position von fmt zu setzen, genau wie „@5s6sif“
-----Probleme bei der Verarbeitung von Binärdateien--- --
Wenn wir Binärdateien verarbeiten, müssen wir die folgende Methode
binfile=open(filepath,'rb') verwenden, um Binärdateien
oder
binfile=open(filepath,'wb') Binärdatei schreibenWas ist also der Unterschied zwischen den Ergebnissen von binfile=open(filepath,'r')? Es gibt zwei Unterschiede: Erstens: Wenn Sie bei der Verwendung von „r“ auf „0x1A“ stoßen, wird dies als das Ende der Datei betrachtet, also EOF. Bei Verwendung von „rb“ tritt dieses Problem nicht auf. Das heißt, wenn Sie im Binärformat schreiben und im Text auslesen, wird nur ein Teil der Datei ausgelesen, wenn „0X1A“ vorhanden ist. Bei Verwendung von „rb“ wird bis zum Ende der Datei gelesen. Zweitens können wir für die Zeichenfolge x='abc/ndef' len(x) verwenden, um ihre Länge auf 7 zu bringen. /n wird als Newline-Zeichen bezeichnet, das eigentlich „0X0A“ ist. Wenn wir im Textmodus „w“ schreiben, wird „0X0A“ auf der Windows-Plattform automatisch in zwei Zeichen „0X0D“, „0X0A“ geändert, dh die Dateilänge beträgt tatsächlich 8. Beim Lesen im Textmodus „r“ wird es automatisch in das ursprüngliche Zeilenumbruchzeichen konvertiert. Wenn Sie zum Schreiben in den Binärmodus „wb“ wechseln, bleibt ein Zeichen unverändert und wird beim Lesen so gelesen, wie es ist. Wenn Sie also im Textmodus schreiben und im Binärmodus lesen, müssen Sie dieses zusätzliche Byte berücksichtigen. „0X0D“ wird auch Wagenrücklaufzeichen genannt.Es wird sich unter Linux nicht ändern. Weil Linux nur „0X0A“ zur Darstellung von Zeilenumbrüchen verwendet.