そう言えば、まだディクショナリを使ったことがなかった。いまいち使うシーンが想像できなかったので使ってなかったんだけど、無理やりcsvファイルを扱うことに対して使ってみます。
以下のモジュールreadcsv.pyはファイルemp.csvを読み込み、時給×労働時間をデータごとに計算するという簡単なプログラム。
readcsv.py
def readcsv(filename): L = [line[:-1] for line in file(filename).readlines()] return map((lambda s: s.split(',')),L) csvlist = readcsv('emp.csv') for line in csvlist[1:]: empdict = dict(zip(csvlist[0],line)) payment = int(empdict['WAGE']) * int(empdict['HOURS']) print empdict['NAME'],'->',payment
まずreadcsv関数の中では、csvファイルの各行を行末の1文字(改行記号)を抜いた形で取得し、それぞれの行をカンマで分割してリストにする。返り値は「各行が要素となっているリスト、が要素となっているリスト」になる。ここでは練習のために、リスト内包表記を使ってみた。
実行部では、先ほど作ったリストの1番目の要素(ヘッダー)、と2番目以降の要素を
empdict = dict(zip(csvlist[0],line))
という部分でディクショナリ化する。あとはそれぞれの要素にヘッダーの名前でアクセス出来るようになるので、それを使って給与計算を行い結果を出力している。この方法であれば、CSVファイルのカラムの順番などにも影響されない処理が組めるはず。
emp.csv
NAME,WAGE,HOURS John,1000,8 Tom,1200,9 Jack,1100,8 Nick,1200,9 Shelly,1200,7 Bill,1000,8 David,1100,9 Ron,1000,8 Kate,1000,9 Mary,1100,9
実行結果。
John -> 8000 Tom -> 10800 Jack -> 8800 Nick -> 10800 Shelly -> 8400 Bill -> 8000 David -> 9900 Ron -> 8000 Kate -> 9000 Mary -> 9900
これと同じ方法で、DBからSQLにて取ってきたデータの処理も出来るはずだ。