Python の csv モジュールの DictWriter を使ってみます。
DictWriter のドキュメントは こちら です。
DictWriterは辞書型の変数を出力するオブジェクトになります。
DictWriterの基本的な使い方
サンプルコードをお見せします。
コードの詳細は次の章で説明します。
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が出力されます。
この例では、Country, Job, Ageをヘッダとして、個人の情報をCSVに書き出しています。
名前部分が出力されていないところは後述します。
ヘッダ情報はfieldnamesで渡します。
DictWriterオブジェクト生成時に渡すfieldnamesパラメータは、writerow()するときに存在するKEYを伝えるパラメータです。fieldnamesで渡していないKEYでwriterow()するとエラーになります。
サンプルコードの補足説明
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部分を出力したい場合は、こちらのコードとなります。
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()