2009-12-24 17 views
8

Alcuni file dei risultati prodotti da programmi Fortran segnalare i numeri di doppia precisione (in notazione scientifica) utilizzando la lettera D invece di E, per esempio:Python notazione scientifica utilizzando D anziché E

1.2345D+02 
# instead of 
1.2345E+02 

ho bisogno di elaborare enormi quantità di questi dati utilizzando Python, e ho appena capito che non è in grado di leggere i numeri nella notazione D, per esempio:

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

Posso cambiare il mio locale e far sapere che Python D significa E? Non vorrei davvero fare una ricerca e sostituzione globale!

+2

Immagino che la modifica dei programmi Fortran non sia un'opzione? –

+1

@HP Mark: non un'opzione. – Escualo

+3

Vorrei usare sed per copiare il file e scriverlo nel formato richiesto dal programma Python. Ma poi, userei sed per la maggior parte dei programmi comunque :-) –

risposta

9

Il modo più semplice, dal vostro programma Python, sarebbe solo per aggiungere un passo prima di interpretare ogni voce:

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

Lo accetterò come risposta, ma sono triste che Python non abbia un modo migliore per farlo. Grazie! – Escualo

14

Se avete a che fare con un sacco di dati e/o stanno facendo molto calcoli con tali dati, potresti prendere in considerazione l'utilizzo del modulo numpy fortran-friendly che supporta il formato fortran a precisione doppia fuori dalla scatola.

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

Sto rimandando Numpy per un lungo periodo ... forse è ora di riconsiderare. Grazie! (+1) – Escualo

+0

Nelle versioni precedenti di NumPy (ad esempio, 1.3.0) si genera un errore ValueError. Non sono sicuro di quale versione di NumPy sia stata introdotta. –

+0

numpy versione 1.80 continua a non supportarlo. Esattamente quale versione di numpy era questa? – talonmies

7

Un'altra opzione è la libreria fortranformat per Python. Legge le stringhe e le interpreta in base a un'istruzione di formato FORTRAN. vale a dire

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

Installare con easy_install -U fortranformat

Tutte le domande, e-mail me (io sono l'autore).

Problemi correlati