1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSONファイルをCSVファイルに変換する

1
Posted at

はじめに

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": "エンジニア"
  }
}

実行結果

image.png

参考にしたサイト

下記サイトの情報がとても参考になりました。ありがとうございます。

Python でcsv出力したら一行空く件
Pythonでダブルクォーテーション囲いのCSVファイルを作成する
Python 辞書で最初のキーを取得する

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?