はじめに
JSONファイルの内容を確認するとき、「特定のキーが"***"のデータだけ抽出したい」くなることがある。条件が1つならエディッタでgrepするなどして確認する方法もあるが、複数のキーで条件を付けたり、見つけたデータの別なキーの値が見たいとなると手間がかかる。
このため、Excelのフィルタ機能が使えないかと思い立ち、JSONファイルをCSVファイルに変換する方法を検討してみた。
実装
サンプルコード
お試しのため、ファイル名はコード内に定義している。
json2csv.py
import os
import json
import csv
# カレントディレクトリ・ファイルパス
APP_PATH = os.getcwd()
# 定数定義
JSON_FILE = 'sample.json'
ENCORDING_UTF_8 = 'utf-8'
ENCORDING_SHIFT_JIS = 'shift_jis'
CSV_FILE = 'sample.csv'
def main():
"""
JSONファイルをcsvファイルに変換する
Args:
なし
returns:
なし
"""
# JSONファイルをdictに変換する
json_path = os.path.join(APP_PATH, JSON_FILE)
with open(json_path, 'rt', encoding=ENCORDING_UTF_8) as json_file:
json_data = json.load(json_file)
# dict配列をcsvファイルに変換する
csv_path = os.path.join(APP_PATH, CSV_FILE)
with open(csv_path, 'w', newline='',
encoding=ENCORDING_SHIFT_JIS, ) as csv_file:
# 列を作る(先頭のデータフォーマットを参考にする)
fieldnames = ['key']
for sub_key in json_data[list(json_data.keys())[0]]:
fieldnames.append(sub_key)
# csvファイルのフォーマットを定義する
# - 上で作った列を指定する
# - カンマ区切り
# - すべて文字列として出力し、""で囲う
writer = csv.DictWriter(csv_file, fieldnames=fieldnames,
delimiter=',', quotechar='"',
quoting=csv.QUOTE_NONNUMERIC)
writer.writeheader()
# dictを1次元配列に変換してcsvファイルに書き込む
for key, value in json_data.items():
# Primary Keyを先頭列に配置
dict_data = {}
dict_data['key'] = key
# データ列を続けて配置
for sub_key in value.keys():
dict_data[sub_key] = value[sub_key]
# csvファイルに1行分のデータを書き込む
writer.writerow(dict_data)
if __name__ == "__main__":
main()
サンプルデータ
ChatGPTにテスト用のデータを作成してもらった。
sample.json
{
"0001": {
"name": "田中 太郎",
"age": 29,
"department": "営業",
"position": "主任"
},
"0002": {
"name": "佐藤 花子",
"age": 34,
"department": "総務",
"position": "係長"
},
"0003": {
"name": "鈴木 一郎",
"age": 41,
"department": "開発",
"position": "課長"
},
"0004": {
"name": "高橋 美咲",
"age": 27,
"department": "人事",
"position": "スタッフ"
},
"0005": {
"name": "渡辺 健",
"age": 38,
"department": "マーケティング",
"position": "リーダー"
},
"0006": {
"name": "伊藤 真理",
"age": 31,
"department": "経理",
"position": "主任"
},
"0007": {
"name": "山本 大輔",
"age": 45,
"department": "法務",
"position": "顧問"
},
"0008": {
"name": "中村 直人",
"age": 26,
"department": "企画",
"position": "スタッフ"
},
"0009": {
"name": "小林 彩",
"age": 30,
"department": "広報",
"position": "コーディネーター"
},
"0010": {
"name": "加藤 優",
"age": 36,
"department": "ITサポート",
"position": "エンジニア"
}
}
実行結果
参考にしたサイト
下記サイトの情報がとても参考になりました。ありがとうございます。
・Python でcsv出力したら一行空く件
・Pythonでダブルクォーテーション囲いのCSVファイルを作成する
・Python 辞書で最初のキーを取得する
