scipy.io.

FortranFile#

class scipy.io.FortranFile(filename, mode='r', header_dtype=<class 'numpy.uint32'>)[Quelle]#

Eine Datei-Objekt für unformatierte sequentielle Dateien aus Fortran-Code.

Parameter:
filenameDatei oder str

Geöffnete Datei-Objekt oder Dateiname.

mode{‘r’, ‘w’}, optional

Lese-/Schreibmodus, Standard ist ‘r’.

header_dtypedtype, optional

Datentyp des Headers. Größe und Endianness müssen mit der Ein-/Ausgabedatei übereinstimmen.

Methoden

close()

Schließt die Datei.

read_ints([dtype])

Liest einen Datensatz eines gegebenen Typs aus der Datei, standardmäßig ein Ganzzahltyp (INTEGER*4 in Fortran).

read_reals([dtype])

Liest einen Datensatz eines gegebenen Typs aus der Datei, standardmäßig eine Gleitkommazahl (real*8 in Fortran).

read_record(*dtypes, **kwargs)

Liest einen Datensatz eines gegebenen Typs aus der Datei.

write_record(*items)

Schreibt einen Datensatz (einschließlich Größen) in die Datei.

Hinweise

Diese Dateien sind in Datensätze von nicht spezifizierten Typen unterteilt. Die Größe jedes Datensatzes wird am Anfang angegeben (obwohl die Größe dieses Headers nicht standardmäßig ist) und die Daten werden ohne Formatierung auf die Festplatte geschrieben. Fortran-Compiler, die die BACKSPACE-Anweisung unterstützen, schreiben eine zweite Kopie der Größe, um das Rückwärtslaufen zu erleichtern.

Diese Klasse unterstützt nur Dateien, die mit beiden Größen für den Datensatz geschrieben wurden. Sie unterstützt auch nicht die Unterdatensätze, die in Intel- und gfortran-Compilern für Datensätze verwendet werden, die größer als 2 GB mit einem 4-Byte-Header sind.

Ein Beispiel für eine unformatierte sequentielle Datei in Fortran wäre wie folgt geschrieben:

OPEN(1, FILE=myfilename, FORM='unformatted')

WRITE(1) myvariable

Da dies ein nicht standardmäßiges Dateiformat ist, dessen Inhalt vom Compiler und der Endianness des Rechners abhängt, ist Vorsicht geboten. Dateien von gfortran 4.8.0 und gfortran 4.1.2 auf x86_64 funktionieren bekanntermaßen.

Erwägen Sie die Verwendung von Fortran-Dateien mit direktem Zugriff oder Dateien aus der neueren Stream-I/O, die leicht von numpy.fromfile gelesen werden können.

Beispiele

Zum Erstellen einer unformatierten sequentiellen Fortran-Datei

>>> from scipy.io import FortranFile
>>> import numpy as np
>>> f = FortranFile('test.unf', 'w')
>>> f.write_record(np.array([1,2,3,4,5], dtype=np.int32))
>>> f.write_record(np.linspace(0,1,20).reshape((5,4)).T)
>>> f.close()

Zum Lesen dieser Datei

>>> f = FortranFile('test.unf', 'r')
>>> print(f.read_ints(np.int32))
[1 2 3 4 5]
>>> print(f.read_reals(float).reshape((5,4), order="F"))
[[0.         0.05263158 0.10526316 0.15789474]
 [0.21052632 0.26315789 0.31578947 0.36842105]
 [0.42105263 0.47368421 0.52631579 0.57894737]
 [0.63157895 0.68421053 0.73684211 0.78947368]
 [0.84210526 0.89473684 0.94736842 1.        ]]
>>> f.close()

Oder in Fortran

integer :: a(5), i
double precision :: b(5,4)
open(1, file='test.unf', form='unformatted')
read(1) a
read(1) b
close(1)
write(*,*) a
do i = 1, 5
    write(*,*) b(i,:)
end do