2016-11-22 6 views
2

Ich habe eine Ausgabe von altem Code in Fortran 77. Die Ausgabe mitLesen Standardausgabe von Fortran in Python

write(NUM,*) 

Zeile geschrieben wird. Also im Grunde das Standardformat. Im Anschluss wird ein Teil des Ausgangs:

1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394-118 8.02718071E-94 

hatte ich ein Post-Processing-Tool in F77 geschrieben und READ(NUM,*) lesen Sie die Eingabedatei korrekt als:

1.25107598000000E-67 1.89781536000000E-61 1.28064971000000E-94 5.85754394000000E-118 8.02718071000000E-94 

Die problematische Zahl ist 5.85754394-118. Es wird korrekt gelesen, da es 5.85754394E-118 in F77 bedeutet.

jedoch jetzt habe ich eine Nachverarbeitung in Python, und ich habe folgende Codezeile:

Z = numpy.fromstring(lines[nl], dtype=float, sep=' ') 

, die eine Ausgangsleitung für Zeile (durch die Schleife auf nl) gelesen wird. Aber wenn es die 5.85754394-118 Nummer erreicht, wird es aufhören zu lesen, zur nächsten Zeile der Ausgabe gehen und grundsätzlich falsche Nummer lesen. Gibt es eine Möglichkeit, es richtig zu lesen (Standardform von Fortran)? Ich denke, ich muss dtype Option ändern, aber keine Ahnung haben.

+0

Sie meinen, Sie können Ihre seltsam formatierte Nummer nicht nachbearbeiten? –

+0

Ja! das ist richtig –

+0

Können Sie den Fortran-Code, der den korrupten Wert schreibt, leicht ändern? Siehe http://stackoverflow.com/questions/24004824/for-three-digit-exponents-fortran-drops-the-e-in-the-output –

Antwort

4

Sie können Ihre Ausgabe effizient mit einem regulären Ausdruck nachbearbeiten:

import re 

r = re.compile(r"(?<=\d)\-(?=\d)") 

output_line = "1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394-118 8.02718071E-94 " 
print(r.sub("E-",output_line)) 

Ergebnis:

1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394E-118 8.02718071E-94 

(?<=\d)\-(?=\d) führt eine Lookbehind und Look-Ahead für Ziffern und zwischen ihnen für einzelne Minuszeichen suchen . Es ersetzt das Minuszeichen durch E-.

Verwandte Themen