PythonのcsvモジュールでDictWriterを使いたい

TAGS :

csvのDictWriterを使う

Python の csv モジュールの DictWriter を使ってみましょう。
DictWriter のドキュメントは こちら です。

先にコードです。

Python

import os
import csv

data = {
    'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
    'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
    'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}

filename = 'test_a.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'w')
fieldnames = data[list(data.keys())[0]].keys() # Dict型データの1列目のKEYを取得する。
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()  # ここでヘッダが書かれる。
for name in data:
    writer.writerow(data[name])
f.close()

出力された csv です。
出力されたCSVファイル

DictWriter オブジェクト生成時に渡す fieldnames パラメータは、writerow() するときに存在する KEY を伝えるパラメータです。
fieldnames で渡していない KEY で writerow() するとエラーになります。
fieldnames の型はList型みたいですが、コードでは dict_keys型で渡していますが、問題ないようです。

コードの説明

fieldnames を作り出すコードの説明です。
まずは、data の第1階層の KEY を data.keys() で取得します。

print(data.keys())
>> dict_keys(['Ken', 'Alan', 'Steven'])

次に、それをList型にして、

print(list(data.keys()))
>> ['Ken', 'Alan', 'Steven']

配列の0番目を取得すると、第1階層の KEY の先頭の KEY が取得できます。

print(list(data.keys())[0])
>> Ken

最後に、それを使って、第2階層の KEY を取得すれば、fieldnames 情報の完成です。

print(data[list(data.keys())[0]].keys())
>> dict_keys(['Country', 'Job', 'Age'])

その後は、csv にヘッダを書き込みます。

writer.writeheader()

そして、data の 各要素を書き込んでいきます。

writer.writerow(data[name])

第1階層のKEYも出力させるコード

これで CSV ファイルはできたのですが、data の Name 情報が出力されていません。
Name 情報を出力したい場合は、こちらのコードをお使いください。

Python

import os
import csv

data = {
    'Ken' : { 'Country': 'US', 'Job': 'Artist', 'Age': 56 },
    'Alan' : { 'Country': 'Japan', 'Job': 'Carpenter', 'Age': 27 },
    'Steven' : { 'Country': 'China', 'Job': 'Artist', 'Age': 40 }
}

filename = 'test_b.csv'
file_path = os.path.join(os.getcwd(), filename)
f = open(file_path, 'w')
fieldnames = data[list(data.keys())[0]].keys() # Dict型データの1列目のKEYを取得する。
fieldnames = ['Name'] + list(fieldnames) # "Name"キーを先頭に追加する。
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()  # ここでヘッダが書かれる。
for name in data:
    data_new = {'Name': name} # "Name"キーを含むDict型を新たに作成する。
    data_new.update(data[name]) # "Name"キー以外の要素を追加する。
    writer.writerow(data_new)
f.close()

出力された csv です。
出力されたCSVファイル