以下の内容はhttps://pydocument.hatenablog.com/entry/2023/03/24/223507より取得しました。


PythonでJSON形式のデータを読み込む方法とエラーハンドリング

JSON (JavaScript Object Notation) は、Web APIや設定ファイルなどで広く利用されている軽量なデータ交換フォーマットです。PythonJSONを標準でサポートしており、jsonモジュールを使うことで、JSON形式のデータを簡単に読み書きできます。この記事では、PythonJSONファイルを読み込む方法とよく発生するエラーの対応方法を解説します。

JSONファイルの読み込み

まずはJSONファイルを読み込む基本的な方法を説明します。Pythonjsonモジュールをインポートし、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データの確認

  1. 閉じ括弧の不足/過剰

    { "name": "John", "age": 30  // 不足
    
    { "name": "John", "age": 30 }} // 過剰
    
  2. カンマの不足/過剰

    { "name": "John" "age": 30 } // 不足
    
    { "name": "John", "age": 30, } // 過剰
    
  3. 文字列のクォート忘れ

    { name: "John", age: 30 } // キーがクォートされていない
    
  4. 無効な値

    { "address": Null }  // Null (大文字) は無効
    
  5. コメント

    { "name": "John", // コメントは許可されない
      "age": 30 }
    

これらの例を参考に、エラーメッセージと照らし合わせてJSONファイルを修正してください。エディタやIDEJSON構文チェック機能も活用すると、問題箇所を特定しやすくなります。

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引数にファイルオブジェクトを渡します。
  • indentensure_asciijson.dumps()と同様に機能します。

まとめ

Pythonjsonモジュールを使うと、JSONデータの読み込み、書き込み、整形、そしてエラーハンドリングを簡単に行うことができます。json.load()でファイルからJSONデータを読み込み、json.dumps()で整形されたJSON形式の文字列を取得、json.dump()JSONファイルへの書き込みが可能です。ファイルが存在しない場合はFileNotFoundErrorJSONの形式が不正な場合はjson.JSONDecodeErrorが発生するので、適切にエラー処理を行うことで、より堅牢なプログラムを作成できます。これらの機能を活用することで、PythonJSONデータを柔軟に処理し、Web APIとの連携やデータ分析など、さまざまな場面で役立てることができます。

最後にPythonの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/03/24/223507より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14