Ich habe eine Binärdatei, die mit einem Python-Code erstellt wurde. Dieser Code erstellt hauptsächlich eine Reihe von Aufgaben, um eine Reihe von Datendateien vorzuverarbeiten. Ich möchte jetzt diese Binärdatei in Fortran lesen. Der Inhalt der Binärdatei ist die Koordinaten von Punkten in einem einfachen Format zB: Anzahl der Punkte, x0, y0, z0, x1, y1, z1, ...Lesen einer Binärdatei in Fortran, die von einem Python-Code erstellt wurde
Diese binären Dateien wurden mit dem 'tofile' erstellt Funktion in numpy. Ich habe den folgenden Code in Fortran bisher:
integer:: intValue
double precision:: dblValue
integer:: counter
integer:: check
open(unit=10, file='file.bin', form='unformatted', status='old', access='stream')
counter = 1
do
if (counter == 1) then
read(unit=10, iostat=check) intValue
if (check < 0) then
print*,"End Of File"
stop
else if (check > 0) then
print*, "Error Detected"
stop
else if (check == 0) then
counter = counter + 1
print*, intValue
end if
else if (counter > 1) then
read(unit=10, iostat=check) dblValue
if (check < 0) then
print*,"End Of File"
stop
else if (check > 0) then
print*, "Error Detected"
stop
else if (check == 0) then
counter = counter + 1
print*,dblValue
end if
end if
end do
close(unit=10)
Dies ist leider nicht funktioniert, und ich garbage Zahlen (z 6.4731191026611484E + 212, 2.2844499004808491E-279 etc.). Könnte jemand Hinweise geben, wie man das richtig macht? Auch, was wäre eine gute Möglichkeit zum Schreiben und Lesen von Binärdateien austauschbar zwischen Python und Fortran - wie es scheint, wird dies eine der Anforderungen meiner Anwendung sein.
Dank
Ich fügte eine nette und detaillierte Antwort hinzu und sagte, dass du 'access = stream' verwenden sollst :) Ich habe gerade gemerkt, dass du das schon machst, also habe ich meine Antwort vorerst gelöscht. Also, Frage: Sind Sie sicher, dass die Bytegröße Ihres Pythons 'int' und Ihres Fortran' integer' gleich sind? Sie sollten beide überprüfen. Wenn es ein einzelnes Diskrepanzbyte gibt, führt die Fehlausrichtung der Daten nach dem Lesen zu Müll. Welchen Fortran Compiler benutzen Sie? Wie erklärst du deine 'Integer's? Was ist der spezifische Typ deines Pythons? –
Wenn Sie wirklich verzweifelt sind, können Sie versuchen, die (angeblich) gleiche Dummy-Binärdatei sowohl mit Fortran als auch mit Python zu erzeugen, und dann den Hex-Dump der beiden Dateien betrachten, um zu sehen, was los ist. Auch meine frühere Frage nach den "Integer" -Größen gilt offensichtlich auch für die involvierten "Doubles". Und selbst wenn die Typen auschecken, kann es immer noch ein Endianess-Problem geben, wenn Sie die beiden Codes auf zwei sehr unterschiedlichen Rechnern verwenden. –
In Bezug auf die Frage der Austauschbarkeit: Ich würde eher Metadaten wie die Anzahl der Punkte in eine separate ASCII-Header-Datei, die leicht gelesen werden kann, und nur Daten der gleichen Art in eine einzige Binärdatei, dies ermöglicht auch für eine faire einfache Umwandlung von Endianness. – haraldkl