Научная нотация Python с использованием D вместо E

Некоторые файлы результатов, созданные программами Fortran, сообщают о числах с двойной точностью (в экспоненциальном представлении), используя букву D вместо E, например:

1.2345D+02
# instead of
1.2345E+02

Мне нужно обработать огромное количество этих данных с помощью Python, и я только что понял, что он не может читать числа в нотации D, например:

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

Могу ли я изменить свою локаль и сообщить Python, что D означает E? Очень не хотелось бы делать глобальный поиск-замену!


person Escualo    schedule 24.12.2009    source источник
comment
Я предполагаю, что модификация ваших программ на Фортране не вариант?   -  person High Performance Mark    schedule 24.12.2009
comment
@HP Mark: не вариант.   -  person Escualo    schedule 24.12.2009
comment
Я бы использовал sed, чтобы разорвать файл и записать его в формате, который хочет ваша программа Python. Но тогда я бы все равно использовал sed для большинства программ :-)   -  person High Performance Mark    schedule 24.12.2009


Ответы (3)


Самый простой способ из вашей программы на Python — просто добавить шаг перед интерпретацией каждой записи:

>>> val = "1.5698D+03"  # 1,569.8
>>> print float(val.replace('D', 'E'))
1569.8
person John Feminella    schedule 24.12.2009
comment
Я приму это как ответ, но мне грустно, что у Python нет лучшего способа сделать это. Спасибо! - person Escualo; 04.01.2010

Если вы имеете дело с большим количеством данных и/или выполняете много вычислений с этими данными, вы можете рассмотреть возможность использования удобного для fortran модуль numpy, который поддерживает формат fortran с двойной точностью из коробки.

>>> numpy.float('1.5698D+03')
1569.8
person Paul    schedule 24.12.2009
comment
Я долго откладывал numpy ... может быть, пришло время передумать. Спасибо! (+1) - person Escualo; 24.12.2009
comment
В более старых версиях NumPy (например, 1.3.0) это вызывает ошибку ValueError. Я не уверен, какая версия NumPy была представлена. - person Mike T; 16.05.2012
comment
numpy версии 1.80 по-прежнему не поддерживает это. Какая именно версия numpy была? - person talonmies; 31.05.2014
comment
Похоже, это работает только в более старых версиях Python на определенных платформах. Это не работает для 64-разрядной версии Windows 7/Python 2.7.9/numpy 1.9.2. См. bugs.python.org/issue7919 . - person JPaget; 06.05.2015
comment
Он также не работает для numpy версии 1.15.3 (последняя на 2018 год). - person Peter Erwin; 21.12.2018

Другой вариант — библиотека fortranformat для Python. Он будет читать строки и интерпретировать их в соответствии с оператором формата FORTRAN. то есть

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

Установить с помощью easy_install -U fortranformat

Если возникнут вопросы, пишите мне (я автор).

person Brendan    schedule 11.07.2011