2009-12-24 26 views
8

Algunos fichero de resultados producidos por los programas Fortran informar los números de precisión doble (en notación científica) utilizando la letra D en lugar de E, por ejemplo:Python notación científica usando D en lugar de E

1.2345D+02 
# instead of 
1.2345E+02 

necesito para procesar enormes cantidades de estos datos usando Python, y me acabo de dar cuenta que no puede leer los números en la notación D, por ejemplo:

>>> A = 1.0D+01 
    File "<stdin>", line 1 
    A = 1.0D+01 
     ^
SyntaxError: invalid syntax 

¿Puedo cambiar la configuración regional y dejar que Python saben que D significa E? ¡Realmente no me gustaría hacer una búsqueda global y reemplazar!

+2

Supongo que modificar sus programas Fortran no es una opción? –

+1

@HP Marca: no es una opción. – Escualo

+3

Usaría sed para copiar el archivo y escribirlo en el formato que tu programa Python quiere. Pero de todos modos, usaría sed para la mayoría de los programas :-) –

Respuesta

9

La forma más sencilla, desde el programa de Python, sería sólo para añadir un paso antes de interpretar cada entrada:

>>> val = "1.5698D+03" # 1,569.8 
>>> print float(val.replace('D', 'E')) 
1569.8 
+1

Aceptaré esto como la respuesta, pero estoy triste Python no tiene una mejor manera de hacer esto. ¡Gracias! – Escualo

14

Si se trata de una gran cantidad de datos y/o están haciendo mucho cálculos con esa información, puede considerar usar el módulo numpy fortran-friendly que admite el formato fortran de precisión doble de fábrica.

>>> numpy.float('1.5698D+03') 
1569.8 
+0

He estado posponiendo el numpy durante mucho tiempo ... tal vez es hora de que lo reconsidere. ¡Gracias! (+1) – Escualo

+0

En versiones anteriores de NumPy (por ejemplo, 1.3.0), esto genera un ValueError. No estoy seguro de qué versión de NumPy se presentó. –

+0

numpy versión 1.80 todavía no es compatible con esto. ¿Exactamente qué versión de numpy era esto? – talonmies

7

Otra opción es la biblioteca fortranformat para Python. Leerá cadenas e interpretará de acuerdo con una declaración de formato de FORTRAN. es decir,

>>> import fortranformat as ff 
>>> line = ff.FortranRecordReader('(F10.0)') 
>>> line.read('1.5698D+03') 
[1569.8] 

Instalar con easy_install -U fortranformat

Cualquier pregunta, email yo (yo soy el autor).

Cuestiones relacionadas