csvファイルをディクショナリで扱ってみる

初めてのPython 第2版

そう言えば、まだディクショナリを使ったことがなかった。いまいち使うシーンが想像できなかったので使ってなかったんだけど、無理やり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にて取ってきたデータの処理も出来るはずだ。