2009-12-24 12 views
8

Niektóre plik Wyniki produkowane przez programy Fortran zgłosić podwójne numery precyzji (w notacji naukowej) przy użyciu list D zamiast E, na przykład:Python notacja naukowa używając D zamiast E

1.2345D+02 
# instead of 
1.2345E+02 

muszę przetwarzać ogromne ilości tych danych przy użyciu Pythona, a ja po prostu sobie sprawę, że nie można odczytać liczby w notacji D, na przykład:

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

Czy mogę zmienić ustawienia regionalne i niech wiedzą, że Python D oznacza E? Naprawdę nie chciałbym dokonać globalnego wyszukiwania i zamiany!

+2

Chyba modyfikowanie programów Fortran nie jest opcją? –

+1

@ Znak H: nie jest opcją. – Escualo

+3

Użyłbym sed do zgrywania pliku i zapisania go do formatu, który chce program Python. Ale wtedy używałbym sed dla większości programów :-) –

Odpowiedz

9

Najprostszym sposobem, z programu Python, byłoby po prostu dodać krok przed zinterpretować każdy wpis:

>>> val = "1.5698D+03" # 1,569.8 
>>> print float(val.replace('D', 'E')) 
1569.8 
+1

Zaakceptuję to jako odpowiedź, ale jestem smutny Python nie ma lepszego sposobu na zrobienie tego. Dzięki! – Escualo

14

Jeśli masz do czynienia z dużą ilością danych i/lub robią wiele obliczeń z dane te można rozważyć użycie przyjaznego dla fortranów modułu numpy, który obsługuje format Fortran o podwójnej precyzji po wyjęciu z pudełka.

>>> numpy.float('1.5698D+03') 
1569.8 
+0

Odkładałem odrętwienie przez długi czas ... może nadszedł czas, że się nad tym zastanawiam. Dziękuję Ci! (+1) – Escualo

+0

W starszych wersjach NumPy (np. 1.3.0) wywołuje to błąd ValueError. Nie jestem pewien, jaka wersja NumPy została wprowadzona. –

+0

numpy wersja 1.80 nadal nie obsługuje tego. Dokładnie jaka była wersja numpy? – talonmies

7

Inną opcją jest fortranformat biblioteka dla Pythona. Odczytuje łańcuchy i interpretuje je zgodnie z instrukcją formatu FORTRAN. tj

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

Instalacja z easy_install -U fortranformat

Wszelkie pytania, napisz do mnie (jestem autorem).

Powiązane problemy