Ich finde es besonders schwierig, Binärdateien mit Python zu lesen. Kannst du mir helfen? Ich muss diese Datei lesen, die in Fortran 90 leicht zu lesen ist
int*4 n_particles, n_groups
real*4 group_id(n_particles)
read (*) n_particles, n_groups
read (*) (group_id(j),j=1,n_particles)
Im Detail ist das Dateiformat:
Bytes 1-4 -- The integer 8.
Bytes 5-8 -- The number of particles, N.
Bytes 9-12 -- The number of groups.
Bytes 13-16 -- The integer 8.
Bytes 17-20 -- The integer 4*N.
Next many bytes -- The group ID numbers for all the particles.
Last 4 bytes -- The integer 4*N.
Wie kann ich das mit Python lesen? Ich habe alles versucht, aber es hat nie funktioniert. Gibt es eine Möglichkeit, dass ich ein f90-Programm in Python verwende, diese Binärdatei lese und dann die Daten speichere, die ich verwenden muss?
fromfile
Funktion von Numpy erleichtert das Lesen von Binärdateien. Ich empfehle es.Antworten:
Lesen Sie den Inhalt der Binärdatei folgendermaßen:
dann "entpacken" Sie Binärdaten mit struct.unpack :
Die Startbytes:
struct.unpack("iiiii", fileContent[:20])
Der Körper: Ignoriere die Überschriftenbytes und das nachfolgende Byte (= 24); Der verbleibende Teil bildet den Körper. Um die Anzahl der Bytes im Körper zu kennen, wird eine ganzzahlige Division durch 4 durchgeführt. Der erhaltene Quotient wird mit der Zeichenfolge multipliziert
'i'
, um das richtige Format für die Entpackmethode zu erstellen:Das Endbyte:
struct.unpack("i", fileContent[-4:])
quelle
import struct
Im Allgemeinen würde ich empfehlen, dass Sie sich mit der Verwendung des Strukturmoduls von Python befassen . Es ist Standard bei Python und es sollte einfach sein, die Spezifikation Ihrer Frage in eine Formatierungszeichenfolge zu übersetzen, die für geeignet ist
struct.unpack()
.Beachten Sie, dass Sie, wenn zwischen den Feldern "unsichtbare" Auffüllungen vorhanden sind, dies herausfinden und in den
unpack()
Aufruf aufnehmen müssen, da Sie sonst die falschen Bits lesen.Das Lesen des Inhalts der Datei, um etwas zum Entpacken zu haben, ist ziemlich trivial:
Dadurch werden die ersten beiden Felder entpackt, vorausgesetzt, sie beginnen ganz am Anfang der Datei (kein Auffüllen oder fremde Daten), und es wird auch die native Bytereihenfolge (das
@
Symbol) angenommen. DieI
s in der Formatierungszeichenfolge bedeuten "Ganzzahl ohne Vorzeichen, 32 Bit".quelle
Sie können verwenden
numpy.fromfile
, die Daten sowohl aus Text- als auch aus Binärdateien lesen können. Sie würden zuerst einen Datentyp erstellen, der Ihr Dateiformat darstelltnumpy.dtype
, und diesen Typ dann mit aus der Datei lesennumpy.fromfile
.quelle
So lesen Sie eine Binärdatei in ein
bytes
Objekt:So erstellen Sie ein
int
Byte 0-3 der Daten:So entpacken Sie mehrere
int
s aus den Daten:pathlib
int.from_bytes()
struct
quelle
Ich fand auch, dass Python beim Lesen und Schreiben von Binärdateien fehlt, deshalb habe ich ein kleines Modul geschrieben (für Python 3.6+).
Mit binaryfile würden Sie so etwas tun (ich vermute , da ich Fortran nicht kenne):
Was eine Ausgabe wie diese erzeugt:
Ich habe skip () verwendet, um die zusätzlichen Daten zu überspringen, die Fortran hinzufügt, aber Sie können stattdessen ein Dienstprogramm hinzufügen, um Fortran-Datensätze ordnungsgemäß zu behandeln. In diesem Fall wäre eine Pull-Anfrage willkommen.
quelle
quelle
pickle.load
geladen? Lädt es einen Fortran-Stream, direkte oder sequentielle Dateien? Sie sind unterschiedlich und nicht kompatibel.