Wie Öffnen, Lesen und Schreiben von Dateien in Python 2.7 — Converting-code aus fortran-90 zu Python
Ich bin konvertieren von code aus fortran90 zu python 2.7 und habe Schwierigkeiten zu verstehen, die Argumente, die in Open -, Write-und Read-Funktionen in fortran-code, sowie dem wissen, welche Elemente sind erforderlich, fügen Sie dem code, wenn Schreibe ich es in python.
Hier sind einige Blöcke von fortran-code, den ich verstehen möchte, und konvertieren python:
OPEN(1,FILE=TRIM(filenameOut),RECL=2000)
WRITE(1,*) "tAge/yr (u-r) (u-z) fGas Mstars/MstarsOld"
CLOSE(1)
Ich vermute, dass die "1" ist nur ein label zuweisen, um den Namen der Datei, die TRIM entfernt alle Leerzeichen vor oder nach der variable, auf die das python-äquivalent wäre filenameOut.strip() oder so etwas. Ich bin mir nicht sicher, was die RECL ist zu tun und was ist das python äquivalent für die anderen Funktionen wäre für diesen block.
Anderes Beispiel:
OPEN(1,FILE=TRIM(filenameOut),RECL=2000)
WRITE(1,*) "(u-r) prob(u-r)"
DO countInside=1,nColourBins
WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)
CLOSE(1)
Aus dieser ich würde vermuten, dass das Sternchen bedeutet zu schreiben die nächste Zeile in der Datei. Nochmal, ich bin mir nicht sicher, wie man dies in python noch.
Beispiel zu Lesen, die in der fortran-code:
OPEN(1,FILE=TRIM(filenameBC),RECL=2000)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
READ(1,*)
IOEnd=0
DO WHILE(IOEnd>-1)
READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz
END DO
CLOSE(1)
Ich verstehen, dass die wiederholte READ(1,*) sind einfach ablesen die ersten 7 Zeilen der Datei, aber ich bin mir nicht sicher, python-äquivalent-shortcuts für diese, D. H. für eine Art start in die 8. Zeile oder so etwas.
- Die Kontroll-Informations-Liste Optionen für die Eingabe/Ausgabe-Anweisungen (statements, keine Funktionen) sind sehr gut dokumentiert in der standard, Büchern, online-tutorials, usw.. Anstatt zu raten, was Sie bedeuten, wäre es eine viel mehr Konstruktive Nutzung von Zeit, um einen Blick auf eine von denen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
als gemerkt wurde Letzte Zeit, Sie bat diese, die recl= verwendet mit sequenziellem Zugriff ist nicht standard, hat nix mit mindestens einem compiler, und fast sicher ignoriert werden sollte.
In python geben, die Sie Lesen von Zeilen als strings und verarbeiten den string, so etwas wie dieses:
Elemente hält Ihre Werte als strings.. Sie dann konvertieren Grundlage Typ:
ich nur geflügelte dies ohne zu testen..aber es sollte Ihnen den Einstieg.
Einer gotcha, fortran mit der "*" wird gelesen aus mehreren Zeilen, wenn nötig. Ich bezweifle, dass dies der Fall ist, hier aber der Vollständigkeit halber müssen Sie etwas tun, wie diese,
schreiben, die Sie ausprobieren können:
oder
weder diese erhalten Sie genau die Ausgabe, die Sie bekommen würde, von fortran. Wenn Sie den gleichen Abstand, Nachkommastellen, usw. siehe Vladimirs Kommentar..
(Wenn ein Wert in python ist 0,1 es ist nicht eine einfache Möglichkeit, zu erzwingen, Druck der nachfolgende Nullen 0.100000, als würde man mit fortran )
Ihre erste Beispiel ist eindeutig falsch Klammern. Es sollte wie in der zweiten.
Trim löscht nur die Leerzeichen. Hier ist es wohl nicht nötig.
In Ihrem Fall der Datei verbunden werden, um den sequenziellen Zugriff. In diesem Fall AUSW legt die maximale Satzlänge für die Datei (also die Länge der Linie). Es ist durchaus möglich, dass Sie es ignorieren.
Das Sternchen in der zweiten position des I/O-Anweisungen bedeutet, dass die Nutzung der Liste-Regie format. Dies gibt der compiler eine gewisse Freiheit darin, wie genau das format der Ausgabe. Er hat insbesondere-compiler weiter auf die nächste Zeile (Datensatz), wenn die Ausgabe zu lang ist, oder wenn die Eingabe nicht enthalten alle te Elemente in der aktuellen.
So,
READ(1,*,IOSTAT=IOEnd) logTime,Mbol,g,uMg,gMr,gMi,gMz
können liest 1 Zeile, wenn es enthält 7 items, es kann aber auch rot aus 7 Linien mit einem Punkt. Zählen Sie mit, diese in Ihrem Python-code, wenn Sie möchten, um diese Flexibilität.
WRITE(1,*) uMinusrMidpointsArray(countInside),probuMinusrArray(countInside)
schreiben sollte, nur um eine Zeile, da es nur zwei Gegenstände, es sei denn, Sie sind lange strings.vom sys
import argv
Skript,