nano_exit

量子力学、固体物理、fortran、python、etc

fortranとpython(読み込み)

fortranユーザーからpythonに移って来ると、ただテキスト編集したいのにも関わらず、fortranの癖に慣れてしまったが故にpythonがなかなか使えるようにならんかったのでちょっと整理。

「ファイルを開いて中身を読んで閉じる」までをfortranpythonで比較。

implicit none
integer, parameter :: INPUT = 10
real(kind(0d0))    :: InputData( 50, 50 ), ...
!----------
InputData
open( INPUT, 'test.inp', status='old' )
do i = 1, 50
  read(INPUT, *) InputData( i, : )
enddo
close( INPUT )

test.inpが 50 x 50 以上のデータを持っていると仮定して、InputDataの配列サイズを指定。
'test.inp'に対応する番号として10(=INPUT)を割り当ててあげてファイルを開き、i行目の各列のデータをreadでInputDataに流し込む。
それを50行目まで繰り返してファイルを閉じる。

f = open( 'test.inp', 'r' )
lines = f.read().split('\n')
f.close()
InputData = []
for i, line in enumrate( lines ):
    temps = line.split(' ')
    while '' in temps: temps.remove('')
    InputData += temps

読み込み形式('r')で'test.inp'を開き、中身をlinesにいきなりリストとして突っ込みファイルは閉じる。.split('\n')によって改行ごとに(つまり各行が)違う要素としてlinesの中に収納されている。lines[0]は一行目全部、lines[1]は二行目全部、といった具合。
それを値として全部ぶつ切りに区別したデータとするため、linesの中の要素line(つまりある一つの行)を空白で区切って(.split(' '))、空白が連続している場合には空の要素''が生まれてしまうためwhile文を使って除いている。
綺麗に区切ったデータをInputDataに突っ込む作業を全ての行に対して行う。


おそらくpythonfortranと同じように読ませようとするとこんな感じになるのではないかと思う。
fortranは「行列」を最初から想定しているような節を感じる。型が決まっているなら、その型にハマる様に最初に設定してしまえばあんまり何も考えなくて済む(その代わり型から外れると酷いが)。
一方でpythonは、一本の長いリストに収納してからグニグニ変形させる。かなり自由が利く分、自分がやりたいことを実践するために出来る方法も多く、結果どうしたら良いかわからなくなることも多かった(ファイルを読み込むだけなのにいくつか方法があるというのも新参者には割とストレスになった。。。)。
とりあえず今はこんな感じで落ち着いているが、もっとスマートな方法が多分あると思う。先は蛇のように長い。。。