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 です。
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'])
>> dict_keys(['Ken', 'Alan', 'Steven'])
次に、それをList型にして、
print(list(data.keys()))
>> ['Ken', 'Alan', 'Steven']
>> ['Ken', 'Alan', 'Steven']
配列の0番目を取得すると、第1階層の KEY の先頭の KEY が取得できます。
print(list(data.keys())[0])
>> Ken
>> Ken
最後に、それを使って、第2階層の KEY を取得すれば、fieldnames 情報の完成です。
print(data[list(data.keys())[0]].keys())
>> dict_keys(['Country', 'Job', 'Age'])
>> 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 です。