目次
Pythonのライブラリcsv.DictReaderの使い方
CSVの情報を辞書で扱うようにすることで、コードが綺麗に書けるようになります。
サンプルのCSV
- ヘッダーなしを想定しています。
使用しているサンプルのCSVです。
テストデータ・ジェネレータというサンプルを出力するサイトで作ったデータなので安心してご使用ください。
河野 研五,コウノ ケンゴ,男,O,1986/04/21 久保 敬生,クボ ユキオ,男,A,1973/01/10 内海 虎之助,ウツミ トラノスケ,男,A,1979/10/31 佐々木 健之,ササキ タケシ,男,B,1984/08/06 浅野 亮子,アサノ リョウコ,女,O,1980/06/26
DictReaderと共にHeaderを渡すと辞書で返してくれる。
csv_headerで必要なヘッダーを渡すと、CSVの情報を辞書で返してくれて扱いやすくしてくれます。
# -*- coding: utf-8 -*- import csv csv_header = ['名前', '名前フリガナ', '性別', '血液型', '生年月日'] with open('csv_without_header.csv', 'r') as f: # DictReaderと共にHeaderを渡すと辞書で返してくれる。 for row in csv.DictReader(f, csv_header): print(row)
- 出力結果
OrderedDict([('名前', '河野 研五'), ('名前フリガナ', 'コウノ ケンゴ'), ('性別', '男'), ('血液型', 'O'), ('生年月日', '1986/04/21')]) OrderedDict([('名前', '久保 敬生'), ('名前フリガナ', 'クボ ユキオ'), ('性別', '男'), ('血液型', 'A'), ('生年月日', '1973/01/10')]) OrderedDict([('名前', '内海 虎之助'), ('名前フリガナ', 'ウツミ トラノスケ'), ('性別', '男'), ('血液型', 'A'), ('生年月日', '1979/10/31')]) OrderedDict([('名前', '佐々木 健之'), ('名前フリガナ', 'ササキ タケシ'), ('性別', '男'), ('血液型', 'B'), ('生年月日', '1984/08/06')]) OrderedDict([('名前', '浅野 亮子'), ('名前フリガナ', 'アサノ リョウコ'), ('性別', '女'), ('血液型', 'O'), ('生年月日', '1980/06/26')])
関数化して使いやすくする
この後扱いやすいように関数化しておきます。
# -*- coding: utf-8 -*- import csv def get_csv_dict(): csv_header = ['名前', '名前フリガナ', '性別', '血液型', '生年月日'] csv_dict = [] with open('csv_without_header.csv', 'r') as f: # DictReaderと共にHeaderを渡すと辞書で返してくれる。 for row in csv.DictReader(f, csv_header): csv_dict.append(row) return csv_dict csv_dicts = get_csv_dict() for csv_dict in csv_dicts: print(csv_dict)
- 出力結果
OrderedDict([('名前', '河野 研五'), ('名前フリガナ', 'コウノ ケンゴ'), ('性別', '男'), ('血液型', 'O'), ('生年月日', '1986/04/21')]) OrderedDict([('名前', '久保 敬生'), ('名前フリガナ', 'クボ ユキオ'), ('性別', '男'), ('血液型', 'A'), ('生年月日', '1973/01/10')]) OrderedDict([('名前', '内海 虎之助'), ('名前フリガナ', 'ウツミ トラノスケ'), ('性別', '男'), ('血液型', 'A'), ('生年月日', '1979/10/31')]) OrderedDict([('名前', '佐々木 健之'), ('名前フリガナ', 'ササキ タケシ'), ('性別', '男'), ('血液型', 'B'), ('生年月日', '1984/08/06')]) OrderedDict([('名前', '浅野 亮子'), ('名前フリガナ', 'アサノ リョウコ'), ('性別', '女'), ('血液型', 'O'), ('生年月日', '1980/06/26')])
後から必要な項目だけを取り出せる。
want_item_headerに欲しい項目を指定するとそれが取り出せます。
# -*- coding: utf-8 -*- import csv def get_csv_dict(): csv_header = ['名前', '名前フリガナ', '性別', '血液型', '生年月日'] csv_dict = [] with open('csv_without_header.csv', 'r') as f: # DictReaderと共にHeaderを渡すと辞書で返してくれる。 for row in csv.DictReader(f, csv_header): csv_dict.append(row) return csv_dict csv_dicts = get_csv_dict() want_item_header = ['名前', '性別'] for csv_dict in csv_dicts: print(([csv_dict[h] for h in want_item_header]))
- 出力結果
['河野 研五', '男'] ['久保 敬生', '男'] ['内海 虎之助', '男'] ['佐々木 健之', '男'] ['浅野 亮子', '女']
コメント