Python scientific notation using D instead of E
Asked Answered
N

3

18

Some results file produced by Fortran programs report double precision numbers (in scientific notation) using the letter D instead of E, for instance:

1.2345D+02
# instead of
1.2345E+02

I need to process huge amounts of this data using Python, and I just realized it cannot read the numbers in the D notation, for instance:

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

Can I change my locale and let Python know that D means E? I really would not want to make a global search-and-replace!

Neonatal answered 24/12, 2009 at 17:52 Comment(3)
I guess modifying your Fortran programs is not an option ?Estrada
@HP Mark: not an option.Neonatal
I'd use sed to rip through the file and write it into the format your Python program wants. But then, I'd use sed for most programs anyway :-)Estrada
D
15

The simplest way, from your Python program, would be just to add a step before you interpret each entry:

>>> val = "1.5698D+03"  # 1,569.8
>>> print float(val.replace('D', 'E'))
1569.8
Devoirs answered 24/12, 2009 at 18:0 Comment(1)
I will accept this as the answer, but I'm sad Python does not have a better way to do this. Thanks!Neonatal
C
13

If you are dealing with lots of data and/or are doing a lot computations with that data, you might consider using the fortran-friendly numpy module which supports double-precision fortran format out of the box.

>>> numpy.float('1.5698D+03')
1569.8
Carnallite answered 24/12, 2009 at 18:31 Comment(5)
I've been putting off numpy for a long time... maybe it's time I reconsider. Thank you! (+1)Neonatal
On older versions of NumPy (e.g., 1.3.0) this raises a ValueError. I'm not sure what version of NumPy this was introduced.Putt
numpy version 1.80 still doesn't support this. Exactly what version of numpy was this?Pitt
This appears to work only on older versions of Python on certain platforms. It doesn't work for Windows 7 64-bit/Python 2.7.9/numpy 1.9.2. See bugs.python.org/issue7919 .Forgotten
It doesn't work for numpy version 1.15.3 (most recent as of 2018), either.Hypothermal
P
8

Another option is the fortranformat library for Python. It will read strings and interpret them according to a FORTRAN format statement. i.e.

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

Install with easy_install -U fortranformat

Any questions, email me (I'm the author).

Pyelonephritis answered 11/7, 2011 at 23:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.