はじめに

現代のソフトウェア開発において、データは標準化された形式で保存・転送されることが一般的です。JSON (JavaScript Object Notation) と YAML (YAML Ain't Markup Language) は、Web API のレスポンスからアプリケーションの設定ファイルに至るまで、最も広く利用されている2つのデータ形式です。

この実験では、Python でこれらの形式を扱うための基本的なスキルを習得します。まず、Python 標準の json モジュールを使用して JSON データの読み書きを行います。次に、より人間が読みやすい代替形式である YAML を扱い、ruamel.yaml ライブラリを使用して解析する方法を学びます。最後に、anyconfig ライブラリを紹介します。これは、基盤となる実装を意識することなく、さまざまなファイル形式からデータを読み込めるようにすることで、設定管理を簡素化する強力なツールです。

JSON の操作

このステップでは、JSON データのシリアライズ(直列化)とデシリアライズ(復元)の方法を学びます。JSON は JavaScript Object Notation の略で、データの保存や転送に適した軽量な形式です。サーバーから Web ページへデータを送信する際によく利用されます。

注: WebIDE (VS Code ライクな環境) の使用方法に慣れていない場合は、まずこちらの実験で学習してください。

まずは、Python の辞書を JSON ファイルに書き出してみましょう。このプロセスをシリアライズと呼びます。

左側のファイルエクスプローラーで json_handler.py ファイルを開き、以下のコードを追加してください。このスクリプトは output.json という名前の新しいファイルを作成します。

## Write JSON file: json.dump() writes Python object as JSON
import json

content = {"name": "Joe", "age": 20}
with open("output.json", "w") as f:  ## Open file in write mode
    json.dump(content, f, indent=2)  ## Write JSON with 2-space indentation

コードの解説:

  • import json: Python 標準の JSON モジュールをインポートします。
  • content = {"name": "Joe", "age": 20}: 保存したい Python 辞書を定義します。
  • with open("output.json", "w") as f:: output.json というファイルを書き込みモード ("w") で開きます。
  • json.dump(content, f, indent=2): content 辞書を JSON 形式でファイル f に書き込みます。indent=2 引数は、JSON を2スペースのインデントで整形し、読みやすくします。

ターミナルでスクリプトを実行してファイルを作成します:

python3 json_handler.py

画面には何も出力されませんが、新しいファイル output.json が作成されています。cat コマンドで内容を確認できます:

cat output.json

整形された JSON 内容が表示されるはずです:

{
  "name": "Joe",
  "age": 20
}

次に、JSON ファイルを Python オブジェクトとして読み込みます。このプロセスをデシリアライズと呼びます。あらかじめ用意されている data.json ファイルを読み込みます。

json_handler.py ファイルを以下のコードに書き換えてください:

## Read JSON file: json.load() parses JSON from file object
import json

with open("data.json", "r") as f:  ## Open file in read mode
    content = json.load(f)  ## Parse JSON and return Python dict/list
    print(content)

新しいコードの解説:

  • with open("data.json", "r") as f:: 既存の data.json ファイルを読み込みモード ("r") で開きます。
  • content = json.load(f): ファイルから JSON データを解析し、Python の辞書に変換します。
  • print(content): 結果の辞書をコンソールに出力します。

スクリプトを再度実行します:

python3 json_handler.py

今度は、ターミナルに Python の辞書が出力されます:

{'username': 'labex', 'id': 12345}

YAML の操作

このステップでは、人間が読みやすいように設計されたデータシリアライズ形式である YAML について学びます。JSON と比較して、YAML は手動でのメンテナンスが容易であり、コメントを記述できるため、設定ファイルとして非常に人気があります。

Python には YAML パーサーが標準搭載されていないため、サードパーティ製のライブラリをインストールする必要があります。主なライブラリとして PyYaml と ruamel.yaml があります。ruamel.yaml ライブラリは YAML 仕様への準拠度が高く、ファイルを変更する際にコメントやフォーマットを保持する能力に優れているため、この実験ではこちらを使用します。

まず、pip を使用して ruamel.yaml をインストールします:

pip install ruamel.yaml

インストールが成功したことを示す出力が表示されます。

それでは、このライブラリを使用して config.yaml ファイルを読み込んでみましょう。エディタで yaml_handler.py ファイルを開き、以下のコードを追加します:

## Read YAML file using ruamel.yaml library
from ruamel.yaml import YAML

with open("config.yaml") as f:
    yaml=YAML()  ## Create YAML parser instance
    data = yaml.load(f)  ## Parse YAML and return Python dict/list
    print(data)

コードの解説:

  • from ruamel.yaml import YAML: ライブラリから必要な YAML クラスをインポートします。
  • with open("config.yaml") as f:: config.yaml ファイルを読み込み用に開きます。
  • yaml=YAML(): YAML パーサーのインスタンスを作成します。
  • data = yaml.load(f): ファイルから YAML コンテンツを解析し、Python オブジェクト(ここでは辞書)に変換します。
  • print(data): 読み込んだデータを出力します。

ターミナルからスクリプトを実行します:

python3 yaml_handler.py

YAML ファイルの内容が Python の辞書形式で出力されます:

{'user': {'name': 'Alex', 'email': 'alex@example.com'}}

Anyconfig の使用

このステップでは、基盤となる設定ファイルの形式を抽象化する非常に便利なライブラリ anyconfig パッケージを紹介します。これを使用すると、JSON、YAML、TOML など、さまざまな形式から Python 辞書を単一のシンプルな関数で読み込むことができます。アプリケーションが複数の設定形式をサポートする必要がある場合に非常に役立ちます。

まず、anyconfig をインストールする必要があります。anyconfig は YAML を解析するためにバックエンドを必要としますが、すでに ruamel.yaml をインストール済みであるため、自動的にそれが使用されます。

pip で anyconfig をインストールします:

pip install anyconfig

インストールが完了したら、anyconfig を使用して設定ファイルを読み込むことができます。前のステップで使用した config.yaml を読み込んでみましょう。

anyconfig_handler.py ファイルを開き、以下のコードを追加します:

## anyconfig: load configuration files in various formats (JSON, YAML, TOML, etc.)
import anyconfig

## anyconfig.load() auto-detects the file format based on the extension.
conf = anyconfig.load("/home/labex/project/config.yaml")
print(conf)

このコードは非常にシンプルです:

  • import anyconfig: ライブラリをインポートします。
  • anyconfig.load(...): この単一の関数で、ファイルのオープン、読み込み、解析を行います。config.yaml が YAML ファイルであることを自動的に検出し、適切なパーサーを使用します。ここでは絶対パスを使用していますが、スクリプトの実行場所が変わる可能性がある場合には良い習慣です。

スクリプトを実行します:

python3 anyconfig_handler.py

この例でも config.yaml を読み込んでいるため、出力は前のステップと同じですが、コードはより簡潔で柔軟になっています。

{'user': {'name': 'Alex', 'email': 'alex@example.com'}}

anyconfig を使用すれば、"config.yaml" を "data.json" に書き換えてスクリプトを再実行するだけで対応可能です。コードを一切変更することなく動作し、出力される辞書は YAML ファイルではなく data.json の内容を反映したものになります。

まとめ

この実験では、Python における2つの一般的なデータシリアライズ形式である JSON と YAML の扱い方を学びました。これらのスキルは、Web API の利用、アプリケーション設定の管理、データ交換などのタスクにおいて不可欠です。

まず、Python 標準の json モジュールを使用して、json.dump() で Python 辞書を JSON ファイルにシリアライズし、json.load() で JSON ファイルを Python オブジェクトにデシリアライズする方法を学びました。

次に、JSON の人間が読みやすい代替形式として YAML を探求しました。ruamel.yaml ライブラリをインストールし、それを使用して YAML ファイルを解析する方法を習得しました。

最後に、設定管理を簡素化する強力なツールである anyconfig ライブラリを紹介しました。anyconfig.load() 関数を使用することで、形式固有のコードを記述することなく、さまざまなファイル形式からデータを読み込めるようになり、アプリケーションの柔軟性と保守性が向上することを理解しました。