Heim  >  Artikel  >  Backend-Entwicklung  >  Eine einfache Möglichkeit, Binärdateien mit Python zu lesen und zu schreiben

Eine einfache Möglichkeit, Binärdateien mit Python zu lesen und zu schreiben

高洛峰
高洛峰Original
2017-02-23 11:22:323010Durchsuche

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.


tr>
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
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
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

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 schreiben

Was 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.

Die oben beschriebene einfache Methode (empfohlen) zum Lesen und Schreiben von Binärdateien mit Python ist der gesamte vom Herausgeber freigegebene Inhalt. Ich hoffe, dass sie Ihnen eine Referenz geben kann, und ich hoffe, dass Sie die chinesische PHP-Website unterstützen.

Weitere verwandte Artikel zu einfachen Methoden zum Lesen und Schreiben von Binärdateien mit Python finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn