DictReader python

Python

Pythonのライブラリcsv.DictReaderの使い方

CSVの情報を辞書で扱うようにすることで、コードが綺麗に書けるようになります。

 

サンプルのCSV

  • ヘッダーなしを想定しています。

使用しているサンプルのCSVです。
テストデータ・ジェネレータというサンプルを出力するサイトで作ったデータなので安心してご使用ください。

csv_without_header.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の情報を辞書で返してくれて扱いやすくしてくれます。

csv_dictreader.py

# -*- 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')])

 

関数化して使いやすくする

この後扱いやすいように関数化しておきます。

csv_dictreader2.py

# -*- 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に欲しい項目を指定するとそれが取り出せます。

csv_dictreader3.py

# -*- 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]))

 

  • 出力結果
['河野 研五', '男']
['久保 敬生', '男']
['内海 虎之助', '男']
['佐々木 健之', '男']
['浅野 亮子', '女']

コメント