JSON (JavaScript Object Notation) は、Web APIや設定ファイルなどで広く利用されている軽量なデータ交換フォーマットです。PythonはJSONを標準でサポートしており、jsonモジュールを使うことで、JSON形式のデータを簡単に読み書きできます。この記事では、PythonでJSONファイルを読み込む方法とよく発生するエラーの対応方法を解説します。
JSONファイルの読み込み
まずはJSONファイルを読み込む基本的な方法を説明します。Pythonのjsonモジュールをインポートし、open()関数でファイルを開き、json.load()関数を使ってJSONデータを読み込みます。
import json # sample.jsonを読み込む with open('sample.json', 'r', encoding='utf-8') as f: data = json.load(f) # dataはPythonの辞書として扱える print(type(data))
open()関数の第2引数'r'は読み込みモードを指定します。- 文字化けを防ぐために、
encoding='utf-8'を指定することを推奨します。(JSONファイルがUTF-8でエンコードされている場合) -
json.load()関数は、JSONデータをPythonの辞書やリストなどのオブジェクトに変換します。これにより、data変数を通じて、Pythonのデータ構造としてJSONの内容にアクセスできるようになります。
JSONデータの操作と整形
読み込んだJSONデータ(Pythonの辞書やリスト)は、通常のPythonオブジェクトと同様に操作できます。
# 例:dataが辞書型の場合、キーを指定して値を取り出す # data = {"name": "John", "age": 30, "city": "New York"} のようなJSONを想定 print(data["name"]) # 例:dataがリスト型の場合、インデックスを指定して要素を取り出す # data = [1, 2, 3, 4, 5] のようなJSONを想定 print(data[0])
json.loadで読みだしたデータは辞書やリストに変換されるため、printでそのまま出力できます。しかし人が読むには適していません。
人が読みやすいように整形して出力するには、json.dumps()関数を使用します。この関数はPythonオブジェクトをJSON形式の文字列に変換します。
import json # sample.jsonを読み込む with open('sample.json', 'r', encoding='utf-8') as f: data = json.load(f) # 整形して出力 print(json.dumps(data, indent=4, ensure_ascii=False))
indentパラメータ: インデントのレベル(スペースの数)を指定します。indent=4とすると、4つのスペースでインデントされます。ensure_ascii=False: 日本語などの非ASCII文字をエスケープせずにそのまま出力します。(デフォルトではensure_ascii=Trueで、非ASCII文字は\uXXXXのような形式にエスケープされます。)
エラーハンドリング
JSONファイルを扱う際によく発生するエラーとその対処法について説明します。
FileNotFoundError: ファイルが存在しない
指定したJSONファイルが存在しない場合、FileNotFoundErrorが発生します。os.path.exists()関数を使ってファイルの存在を確認してから処理を行うと、このエラーを回避できます。
import os import json filename = 'sample.json' if os.path.exists(filename): with open(filename, 'r', encoding='utf-8') as f: data = json.load(f) # ... dataを使った処理 ... else: print(f"エラー: ファイル '{filename}' が見つかりません。")
json.JSONDecodeError: JSONの形式が不正
読み込もうとしたファイルが正しいJSON形式でない場合、json.JSONDecodeErrorが発生します。対象のJSONの確認して以下のような点がないか確認してください。
JSONデータの確認
閉じ括弧の不足/過剰
{ "name": "John", "age": 30 // 不足{ "name": "John", "age": 30 }} // 過剰カンマの不足/過剰
{ "name": "John" "age": 30 } // 不足{ "name": "John", "age": 30, } // 過剰文字列のクォート忘れ
{ name: "John", age: 30 } // キーがクォートされていない無効な値
{ "address": Null } // Null (大文字) は無効コメント
{ "name": "John", // コメントは許可されない "age": 30 }
これらの例を参考に、エラーメッセージと照らし合わせてJSONファイルを修正してください。エディタやIDEのJSON構文チェック機能も活用すると、問題箇所を特定しやすくなります。
Pythonコードでのエラーハンドリング処理
Pythonのコード側では、try-exceptブロックを使ってこのエラーを捕捉し、適切な処理を行なってください。
import json filename = 'sample.json' try: with open(filename, 'r', encoding='utf-8') as f: data = json.load(f) # ... dataを使った処理 ... except json.JSONDecodeError: print(f"エラー: ファイル '{filename}' は正しいJSON形式ではありません。") except FileNotFoundError: print(f"エラー: ファイル '{filename}' が見つかりません。")
上記のようにFileNotFoundErrorを同時にキャッチすることで、ファイルが存在しない場合と、JSONの形式が不正な場合の両方に対応できます。より堅牢なコードになります。
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]
その他のjsonモジュールの関数
json.dump(): PythonオブジェクトをJSONファイルに書き込む
json.dump()は、Pythonの辞書やリストを直接JSONファイルに保存できる便利な関数です。例えば、下記のコードのように、dataという辞書をoutput.jsonというファイルに整形して書き出せます。これにより、プログラムの設定を保存したり(config.jsonのようなファイルに設定を書き出しておいて、次回起動時に読み込む)、Web APIで受け取ったデータをファイルに保存して後で解析したり、といったことが簡単に行えます。 また、時間のかかるデータ分析処理の途中結果をintermediate_data.json のようなファイルに保存することで、プログラムがクラッシュした際など、途中からの再開が容易になります。json.dumps()のように一旦文字列に変換する必要がないため、大きなデータを扱う際にも効率的です。
import json data = { "name": "Alice", "age": 25, "city": "Tokyo" } with open('output.json', 'w', encoding='utf-8') as f: json.dump(data, f, indent=4, ensure_ascii=False)
open()関数の第2引数'w'は書き込みモードを指定します。json.dump()関数の第1引数にPythonオブジェクト、第2引数にファイルオブジェクトを渡します。indentやensure_asciiはjson.dumps()と同様に機能します。
まとめ
Pythonのjsonモジュールを使うと、JSONデータの読み込み、書き込み、整形、そしてエラーハンドリングを簡単に行うことができます。json.load()でファイルからJSONデータを読み込み、json.dumps()で整形されたJSON形式の文字列を取得、json.dump()でJSONファイルへの書き込みが可能です。ファイルが存在しない場合はFileNotFoundError、JSONの形式が不正な場合はjson.JSONDecodeErrorが発生するので、適切にエラー処理を行うことで、より堅牢なプログラムを作成できます。これらの機能を活用することで、PythonでJSONデータを柔軟に処理し、Web APIとの連携やデータ分析など、さまざまな場面で役立てることができます。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]