17

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!

Escualo
  • 40,844
  • 23
  • 87
  • 135

3 Answers3

14

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
John Feminella
  • 303,634
  • 46
  • 339
  • 357
  • 1
    I will accept this as the answer, but I'm sad Python does not have a better way to do this. Thanks! – Escualo Jan 03 '10 at 22:50
14

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
Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Paul
  • 42,322
  • 15
  • 106
  • 123
  • I've been putting off numpy for a long time... maybe it's time I reconsider. Thank you! (+1) – Escualo Dec 24 '09 at 18:32
  • 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. – Mike T May 16 '12 at 02:18
  • 1
    numpy version 1.80 still doesn't support this. Exactly what version of numpy was this? – talonmies May 31 '14 at 09:56
  • 1
    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 http://bugs.python.org/issue7919 . – JPaget May 06 '15 at 05:50
  • 2
    It doesn't work for numpy version 1.15.3 (most recent as of 2018), either. – Peter Erwin Dec 21 '18 at 13:08
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).

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Brendan
  • 18,771
  • 17
  • 83
  • 114