Как прочитать файл с числами в формате fortran в Python?

У меня есть файл txt в формате fortran с такими номерами, как этот 0.755473D-08.

если я использую np.genfromtxt(data,dtype=None), он показывает b'0.755473D-08'. Как я могу избавиться от b?

Вы искали, прежде чем спросить?

Vladimir F 25.04.2018 21:50

См. stackoverflow.com/questions/5989351/… Combine with converters в genfromtxt.

Vladimir F 25.04.2018 21:51

А этот stackoverflow.com/questions/1959210/…

Simon Johansson 25.04.2018 21:54

Да, но моя проблема в том, что я не могу загрузить числа в формате fortran в python, потому что он показывает nan, а не заменяет D.

kinder chen 25.04.2018 22:32

это вроде конкретно про использование genfromtxt? Я бы сказал, что вам нужно установить тип как строку и преобразовать после прочтения.

agentp 25.04.2018 22:54

b'...' обозначает байтовую строку в py3. Если вы измените "D" на "e", обычный парсинг с плавающей запятой должен работать.

hpaulj 26.04.2018 00:15

@hpaulj Я новичок в проверке байтов, что мне делать? Я попробовал data.replace("D","e"), но он не работает.

kinder chen 26.04.2018 00:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
447
1

Ответы 1

In [315]: txt = '''0.755473D-08
     ...: 0.755473D-08
     ...: 0.755473D-08'''
In [316]: np.genfromtxt(txt.splitlines())
Out[316]: array([nan, nan, nan])
In [317]: np.genfromtxt(txt.splitlines(),dtype=None)
...
Out[317]: array([b'0.755473D-08', b'0.755473D-08', b'0.755473D-08'], dtype='|S12')

Использование строки replace:

In [319]: txt.replace('D','e')
Out[319]: '0.755473e-08\n0.755473e-08\n0.755473e-08'
In [320]: np.genfromtxt(_.splitlines())
Out[320]: array([7.55473e-09, 7.55473e-09, 7.55473e-09])

Это также можно сделать построчно (при чтении из файла).

С преобразователем, примененным к каждому элементу (столбец в строке):

In [326]: np.genfromtxt(txt.splitlines(), converters = {0:lambda x:float(x.replace('D','e'))}, encoding=None)
Out[326]: array([7.55473e-09, 7.55473e-09, 7.55473e-09])

Он не пытается выполнять дальнейшее преобразование dtype после преобразователя, поэтому мне пришлось включить float() в преобразователь.

Другие вопросы по теме