【Python】ファイルを読み込む – JSON形式のファイル編

python-logo Python

PythonでJOSNファイルを読み込む方法。

JSONのファイルを読み込む時は
jsonモジュールを利用するのがスマートだ。

jsonモジュールは標準ライブラリに含まれているので、
import文を書くだけで良い。

import json

今回扱うデータ

今回扱うデータは、以下のような構造化されたデータ。

sample_data.json

{
  "東京都": {
    "id": 1,
    "city": ["千代田区", "港区", "渋谷区"]
  },
  "大阪府": {
    "id": 2,
    "city": ["大阪市", "堺市", "貝塚市"]
  }
}

JSONファイルを辞書として読み込む

JSONのような構造化データは、Pythonでは辞書型として扱う。

import json

with open('sample_data.json', 'r') as file:

    # load()関数を使ってデータを辞書型のデータとして読み込む
    data = json.load(file)

    # 読み込んだデータを出力
    print('そのまま出力: ' + str(data))

    # 辞書型では、キーを指定すればそれに紐づく値が取れる
    print('東京都のみ抽出: ' + str(data['東京都']))


# 出力結果
そのまま出力: {'東京都': {'id': 1, 'city': ['千代田区', '港区', '渋谷区']}, '大阪府': {'id': 2, 'city': ['大阪市', '堺市', '貝塚市']}}
東京都のみ抽出: {'id': 1, 'city': ['千代田区', '港区', '渋谷区']}

取り出したデータを整形する

JSONデータを読み込む方法とは直接関係ないが、
読み込んだJSON形式のデータを出力するときには
いい感じに整形して表示したいという気持ちがある。

辞書型のデータを整形して出力したい場合はpprintモジュールが有効だが、
元データがJSONだと分かっている場合はjsonモジュールの関数を利用するのがスマートである。

ポイントは3つだ。

  • json.dumps()関数を利用する
  • indent=を指定する
  • ensure_ascii=を指定する
import json

with open('sample_data.json', 'r') as file:
    # jsonファイルを読み込む
    data = json.load(file)

    # デフォルトでは非ASCII文字はエスケープされてしまうし、インデントもされない
    print('-- 引数未指定で出力 ---')
    print(json.dumps(data))

    # ensure_ascii=Falseを指定すると、文字がエスケープされなくなる
    print('-- 文字コードをそのまま出力するように指定して出力 ---')
    print(json.dumps(data, ensure_ascii=False))

    # indent=2で、インデントのサイズを指定することができる
    print('-- インデントを指定して出力 ---')
    print(json.dumps(data, ensure_ascii=False, indent=2))

# 出力結果
-- 引数未指定で出力 ---
{"\u6771\u4eac\u90fd": {"id": 1, "city": ["\u5343\u4ee3\u7530\u533a", "\u6e2f\u533a", "\u6e0b\u8c37\u533a"]}, "\u5927\u962a\u5e9c": {"id": 2, "city": ["\u5927\u962a\u5e02", "\u583a\u5e02", "\u8c9d\u585a\u5e02"]}}

-- 文字コードをそのまま出力するように指定して出力 ---
{"東京都": {"id": 1, "city": ["千代田区", "港区", "渋谷区"]}, "大阪府": {"id": 2, "city": ["大阪市", "堺市", "貝塚市"]}}

-- インデントを指定して出力 ---
{
  "東京都": {
    "id": 1,
    "city": [
      "千代田区",
      "港区",
      "渋谷区"
    ]
  },
  "大阪府": {
    "id": 2,
    "city": [
      "大阪市",
      "堺市",
      "貝塚市"
    ]
  }
}

まとめ

  • jsonモジュールを使えば大抵のJSONデータ操作は行える
  • json.load()で読み込み
  • json.dumps()でいい感じに出力
  • より詳しい説明は他の記事に譲る
タイトルとURLをコピーしました