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*4in Fortran).read_reals([dtype])Liest einen Datensatz eines gegebenen Typs aus der Datei, standardmäßig eine Gleitkommazahl (
real*8in 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.fromfilegelesen 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