7

I am trying to read a Fortran double-precision number like 1.2345D+02 into python, but I got the following error:

>>> float('1.2345D+02')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.2345D+02

By following the advice on Python scientific notation using D instead of E, I tried numpy but I also get the same error:

import numpy
>>> numpy.float("1.2345D+02")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.2345D+02

Is there a solution in Python to read those double precision numbers without just changing the 'D' to 'E'?

EDIT: I replaced a bad syntax on the strings. But still I get errors.

1
  • Just a heads up that maybe the fortranformat Python library (on PyPI) can help - I should probably disclose that I'm the author. Commented Jun 29, 2011 at 18:32

2 Answers 2

5

What's wrong with float(str.replace("D", "E"))?

Please note, numpy DOES support fortran notation: numpy.float("1.2345D+02").

You seem to have some deeper purpose, perhaps shedding light on it would help.

Sign up to request clarification or add additional context in comments.

9 Comments

In general, nothing is wrong with replacing "D" with "E". I just want to know if there is a "native" solution. If numpy supports fortran notation, why is it failing as shown in the example? Yes, I need to parse some huge fortran-generated data files and to extract some particular data. Thanks!
Because numpy.float(1.2345D+02) would be parsed by the python interpreter as a call to numpy.float with 1.2345D+02. 1.2345D+02 is unknown to the python interpreter so it gives an error. "1.2345D+02" is a string, which is perfectly fine.
Thanks. Actually it was a typo on my example. I already corrected it but the error (another one) remains.
Possibly you are using different versions of numpy
At least numpy 1.5.1 doesn't support numpy.float("1.2345D+02").
|
1

The substitution can be made a bit more careful by using a regular expression:

import re
re_dbl_fort = re.compile(r'(\d*\.\d+)[dD]([-+]?\d+)')

text = 'DEW=[0.242D+03 -4.320D-06]'
re_dbl_fort.sub(r'\1E\2', text)
# DEW=[0.242E+03 -4.320E-06]

Or if you have a list of strings (lines) read from a file using readlines():

lines = ['REPORT CARD\n', 'GRADE: D+ (1.3D+00/4.0D+00)\n']
for ln, line in enumerate(lines):
    res = re_dbl_fort.sub(r'\1E\2', line)
    if line != res:
        lines[ln] = res
# ['REPORT CARD\n', 'GRADE: D+ (1.3E+00/4.0E+00)\n']

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.