Чтение Fortran формата двойной точности в Python - PullRequest
7 голосов
/ 13 мая 2011

Я пытаюсь прочитать число с двойной точностью Фортрана, например, 1.2345D + 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«?

РЕДАКТИРОВАТЬ: я заменил неправильный синтаксис в строках.Но все равно я получаю ошибки.

Ответы [ 2 ]

5 голосов
/ 13 мая 2011

Что не так с float(str.replace("D", "E"))?

Обратите внимание, что numy поддерживает формат Fortran: numpy.float("1.2345D+02").

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

1 голос
/ 16 мая 2012

Подстановка может быть выполнена более осторожно с помощью регулярного выражения:

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]

Или, если у вас есть список строк (строк), считанных из файла с использованием 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']
...