2016-11-22 2 views
2

У меня есть выход из старого кода на языке Фортран 77. Выход написан сЧтение вывода по умолчанию Fortran в Python

write(NUM,*) 

линии. Так что в основном, формат по умолчанию. Ниже приводится часть вывода:

1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394-118 8.02718071E-94 

У меня был инструмент пост-обработки написаны в F77 и READ(NUM,*) читать входной файл правильно, как:

1.25107598000000E-67 1.89781536000000E-61 1.28064971000000E-94 5.85754394000000E-118 8.02718071000000E-94 

Проблематика номер 5.85754394-118. Он будет правильно читать, так как это означает 5.85754394E-118 в F77.

Однако, теперь я написал пост-обработки в Python и у меня есть следующий код:

Z = numpy.fromstring(lines[nl], dtype=float, sep=' ') 

, который будет считывать выходную линию по линии (через петлю на nl). Но когда он достигнет номера 5.85754394-118, он перестанет читать, перейдя на следующую строку вывода и в основном прочитав неправильный номер. Есть ли способ прочитать его правильным способом (по умолчанию Fortran)? Я угадаю, мне нужно изменить опцию dtype, но у вас нет подсказки.

+0

Вы имеете в виду, что вам не удалось обработать свой странно отформатированный номер? –

+0

Да! это правильно –

+0

Можете ли вы немного изменить код Fortran, который пишет коррумпированное значение? См. Http://stackoverflow.com/questions/24004824/for-three-digit-exponents-fortran-drops-the-e-in-the-output –

ответ

4

Вы можете постобработку ваш выход эффективно с регулярным выражением:

import re 

r = re.compile(r"(?<=\d)\-(?=\d)") 

output_line = "1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394-118 8.02718071E-94 " 
print(r.sub("E-",output_line)) 

результат:

1.25107598E-67 1.89781536E-61 1.28064971E-94 5.85754394E-118 8.02718071E-94 

(?<=\d)\-(?=\d) выполняет 'назад и предпросмотр для цифр, и поиск одного знака минус между ними , Он заменяет знак минуса на E-.

Смежные вопросы