[Pythonのはじめ方] Part15: JSONファイルの読み書き

Python

PythonでJSONデータを扱ってみよう!

プログラミングをしていると、設定ファイルやAPIとのデータ交換などでJSON (JavaScript Object Notation) という形式のデータによく出会います。JSONは人間にも読み書きしやすく、プログラムでも扱いやすいデータ形式として広く使われています。

このステップでは、Pythonの標準ライブラリである json モジュールを使って、PythonのデータとJSON形式のデータを相互に変換したり、JSONファイルを読み書きしたりする方法を学びます。💪

1. JSONってどんな形式? 🤔

JSONは、キーと値のペア(オブジェクト、Pythonの辞書に似ています)と、値の順序付きリスト(配列、Pythonのリストに似ています)を組み合わせてデータを表現します。

基本的なデータ型は以下の通りです。

JSONのデータ型 Pythonのデータ型 説明
オブジェクト (Object) dict キーと値のペアの集まり。例: {"name": "Taro", "age": 30}
配列 (Array) list 順序付けられた値のリスト。例: ["apple", "banana", "cherry"]
文字列 (String) str ダブルクォーテーションで囲まれたテキスト。例: "Hello, World!"
数値 (Number) int, float 整数または浮動小数点数。例: 123, 3.14
真偽値 (Boolean) bool true または false。Pythonでは True, False に対応。
null None 空の値。Pythonの None に対応。

このように、Pythonの基本的なデータ型とJSONのデータ型は非常によく似ているため、相互に変換しやすいのが特徴です。

2. PythonでJSONを扱う準備 🔧

PythonでJSONデータを扱うには、標準ライブラリの json モジュールをインポートします。特別なインストールは必要ありません。

import json

これで準備完了です!🎉

3. PythonオブジェクトをJSON文字列に変換する (エンコード) ➡️

Pythonの辞書やリストなどのオブジェクトをJSON形式の文字列に変換するには、json.dumps() 関数を使います。(”dumps” は “dump string” の意味です。)

import json

# Pythonの辞書データ
data = {
    "name": "Yamada",
    "age": 25,
    "city": "Tokyo",
    "skills": ["Python", "Web開発", "データ分析"]
}

# PythonオブジェクトをJSON文字列に変換
json_string = json.dumps(data)

print(json_string)
# 出力例: {"name": "Yamada", "age": 25, "city": "Tokyo", "skills": ["Python", "Web\u958b\u767a", "\u30c7\u30fc\u30bf\u5206\u6790"]}

⚠️ 日本語が \uXXXX になっちゃう?

デフォルトでは、json.dumps() はASCII文字以外(日本語など)を \uXXXX という形式にエスケープします。日本語をそのまま表示したい場合は、引数 ensure_ascii=False を指定します。

# 日本語をそのまま出力
json_string_jp = json.dumps(data, ensure_ascii=False)
print(json_string_jp)
# 出力例: {"name": "Yamada", "age": 25, "city": "Tokyo", "skills": ["Python", "Web開発", "データ分析"]}

✨ JSONを見やすく整形する

生成されたJSON文字列は通常1行で出力されますが、indent 引数を指定すると、見やすくインデント(字下げ)された形式で出力できます。数値はインデントするスペースの数を指定します。

# インデントをつけて整形
json_string_pretty = json.dumps(data, ensure_ascii=False, indent=4)
print(json_string_pretty)
# 出力例:
# {
#     "name": "Yamada",
#     "age": 25,
#     "city": "Tokyo",
#     "skills": [
#         "Python",
#         "Web開発",
#         "データ分析"
#     ]
# }

4. PythonオブジェクトをJSONファイルに書き込む 📝

PythonオブジェクトをJSON形式でファイルに保存するには、json.dump() 関数を使います。(”dump” はファイルなどに出力するという意味です。)ファイル操作 (open()with) と組み合わせて使います。

import json

data = {
    "user_id": 101,
    "username": "sato",
    "email": "sato@example.com",
    "active": True,
    "settings": {
        "theme": "dark",
        "notifications": ["email", "push"]
    }
}

# ファイルに書き込む (ensure_ascii=False と indent=4 で日本語対応&整形)
# 'w' は書き込みモード、encoding='utf-8' で文字化けを防ぐ
file_path = 'user_data.json'
with open(file_path, 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

print(f"データが {file_path} に保存されました。🎉")

このコードを実行すると、カレントディレクトリに user_data.json というファイルが作成され、整形されたJSONデータが書き込まれます。

💡 `dump()` vs `dumps()`

  • json.dump(obj, fp, ...): Pythonオブジェクト obj をファイルオブジェクト fp にJSON形式で書き込む。
  • json.dumps(obj, ...): Pythonオブジェクト obj をJSON形式の文字列に変換して返す。

ファイルに直接書き込みたい場合は dump()、JSON文字列として扱いたい場合(例: APIレスポンスとして返すなど)は dumps() を使います。

5. JSON文字列をPythonオブジェクトに変換する (デコード) ⬅️

JSON形式の文字列をPythonのオブジェクト(辞書やリストなど)に変換するには、json.loads() 関数を使います。(”loads” は “load string” の意味です。)

import json

# JSON形式の文字列 (例: APIから受け取ったデータなど)
json_string = '{"product_id": "P001", "name": "スマートフォン", "price": 80000, "in_stock": true}'

# JSON文字列をPythonオブジェクト(辞書)に変換
product_data = json.loads(json_string)

print(product_data)
# 出力例: {'product_id': 'P001', 'name': 'スマートフォン', 'price': 80000, 'in_stock': True}

# Pythonオブジェクトとしてアクセスできる
print(f"商品名: {product_data['name']}") # 出力: 商品名: スマートフォン
print(f"価格: {product_data['price']}")   # 出力: 価格: 80000

JSON文字列中の true はPythonの True に、falseFalse に、nullNone に自動的に変換されます。

6. JSONファイルからPythonオブジェクトを読み込む 📖

JSONファイルの内容を読み込んでPythonオブジェクトに変換するには、json.load() 関数を使います。これもファイル操作と組み合わせて使います。

import json

# 先ほど保存した user_data.json を読み込む
file_path = 'user_data.json'

try:
    # 'r' は読み込みモード、encoding='utf-8' を指定
    with open(file_path, 'r', encoding='utf-8') as f:
        loaded_data = json.load(f)

    print("JSONファイルから読み込んだデータ:")
    print(loaded_data)
    # 出力例:
    # JSONファイルから読み込んだデータ:
    # {'user_id': 101, 'username': 'sato', 'email': 'sato@example.com', 'active': True, 'settings': {'theme': 'dark', 'notifications': ['email', 'push']}}

    # 読み込んだデータにアクセス
    print(f"\nユーザー名: {loaded_data['username']}")
    print(f"テーマ設定: {loaded_data['settings']['theme']}")

except FileNotFoundError:
    print(f"エラー: ファイル '{file_path}' が見つかりません。")
except json.JSONDecodeError:
    print(f"エラー: ファイル '{file_path}' は正しいJSON形式ではありません。")
except Exception as e:
    print(f"予期せぬエラーが発生しました: {e}")

ファイルが存在しない場合や、ファイルの内容が正しいJSON形式でない場合にエラーが発生する可能性があるため、try...except ブロックを使ってエラー処理を行うのが一般的です。(エラー処理については Step 4 で詳しく学びます。)

💡 `load()` vs `loads()`

  • json.load(fp, ...): ファイルオブジェクト fp からJSONデータを読み込み、Pythonオブジェクトに変換して返す。
  • json.loads(s, ...): JSON形式の文字列 s をPythonオブジェクトに変換して返す。

ファイルから直接読み込みたい場合は load()、文字列として持っているJSONデータを変換したい場合は loads() を使います。

7. まとめ 🥳

今回は、PythonでJSONデータを扱うための json モジュールの基本的な使い方を学びました。

  • JSONは、プログラム間でデータをやり取りする際によく使われる形式です。
  • Pythonの json モジュールを使うと、PythonオブジェクトとJSON形式の相互変換が簡単にできます。
  • json.dumps(): PythonオブジェクトをJSON文字列に変換 (エンコード)。
  • json.dump(): PythonオブジェクトをJSONファイルに書き込む。
  • json.loads(): JSON文字列をPythonオブジェクトに変換 (デコード)。
  • json.load(): JSONファイルを読み込んでPythonオブジェクトに変換。
  • ensure_ascii=False で日本語の文字化けを防ぎ、indent で見やすく整形できます。
  • ファイル操作時には encoding='utf-8' を指定し、エラー処理 (try...except) を行うことが推奨されます。

これで、設定ファイルの読み込みやWeb APIから取得したデータの処理など、様々な場面でJSONデータを活用できるようになりました! ✨

次のステップでは、プログラムのエラーに対処するための「例外処理」について学びます。お楽しみに!

参考情報 📚

コメント

タイトルとURLをコピーしました