Чтение формата двойной точности fortran в python

Я пытаюсь прочитать номер двойной точности Fortran, такой как 1.2345 D+02 в python, но я получил следующую ошибку:

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

следуя совету на научная нотация Python с использованием D вместо E, я попробовал numpy, но я также получаю ту же ошибку:

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

есть ли решение в Python для чтения этих чисел двойной точности, не просто меняя " D " на "E"?

EDIT: Я заменил плохой синтаксис на строках. Но все же Я получаю ошибки.

2 ответов


что с float(str.replace("D", "E"))?

обратите внимание, numpy поддерживает нотацию fortran:numpy.float("1.2345D+02").

у вас, кажется, есть некоторые более глубокие цели, возможно, пролить свет на это поможет.


подстановку можно сделать немного более осторожной, используя регулярное выражение:

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'E', text)
# DEW=[0.242E+03 -4.320E-06]

или если у вас есть список строк (строк), считанных из файла с помощью 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'E', line)
    if line != res:
        lines[ln] = res
# ['REPORT CARD\n', 'GRADE: D+ (1.3E+00/4.0E+00)\n']