Python: YAMLファイルの読み込み・書き込み

PythonでYAML形式のデータを扱うには、外部ライブラリ「PyYAML」を使用するのが一般的です。 この記事では、YAMLファイルをPythonで読み込む方法について、基本的な手順から応用例まで詳しく解説します。

PyYAMLのインストール

PyYAMLは標準ライブラリには含まれていないため、以下のコマンドでインストールする必要があります。

pip install pyyaml

このコマンドにより、PyYAMLがインストールされ、PythonでYAMLデータを読み書きできるようになります。

YAMLファイルの読み込み

基本的な読み込み

YAMLファイルをPythonで読み込むには、yaml.safe_load()関数を使用します。この関数は、安全にYAMLデータを辞書型やリスト型に変換します。

サンプルコード

以下のように、config.yamlというファイルからデータを読み込む例を示します。

import yaml

# YAMLファイルを開いて内容を読み込む
with open('config.yaml', 'r', encoding='utf-8') as file:
    data = yaml.safe_load(file)

# 読み込んだデータを表示
print(data)

サンプルYAMLファイル (config.yaml)

database:
  host: localhost
  port: 3306

city: Tokyo

実行結果

上記コードを実行すると、以下のような辞書型データが得られます。

{'database': {'host': 'localhost', 'port': 3306}, 'city': 'Tokyo'}

ネストされたデータへのアクセス

読み込んだデータは辞書型として扱えるため、キーを指定して値にアクセスできます。

サンプルコード

# 必要な値を取得
host = data['database']['host']
port = data['database']['port']
city = data['city']

print(f"Host: {host}")
print(f"Port: {port}")
print(f"City: {city}")

実行結果

Host: localhost
Port: 3306
City: Tokyo

YAMLファイルへの書き込み

Pythonのオブジェクト(辞書やリストなど)をYAML形式で保存するには、yaml.dump()関数を使用します。

サンプルコード

import yaml

data = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}

# YAML形式でファイルに書き込む
with open('output.yaml', 'w', encoding='utf-8') as file:
    yaml.dump(data, file, allow_unicode=True)

出力結果 (output.yaml)

age: 30
city: New York
name: John Doe

日本語対応について

日本語などのマルチバイト文字が含まれる場合は、allow_unicode=Trueオプションを指定することで文字化けを防ぐことができます。

複数行データの記述方法

YAMLでは複数行の文字列データを記述するために特別な記法が用意されています。これにより、長い文字列や改行を含むテキストも簡単に扱うことができます。

リテラルスタイル (|)

改行をそのまま保持したい場合は、パイプシンボル (|) を使用します。

サンプルYAMLファイル (literal_example.yaml)

text: |
  吾輩は猫である。
  名前はまだ無い。

Pythonコードでの読み込みと結果

import yaml

with open('literal_example.yaml', 'r', encoding='utf-8') as file:
    data = yaml.safe_load(file)

print(data['text'])

出力結果

吾輩は猫である。
名前はまだ無い。

折りたたみスタイル (>)

改行をスペースに置き換えたい場合は、大なり記号 (>) を使用します。

サンプルYAMLファイル (folded_example.yaml)

text: >
  吾輩は猫である。
  名前はまだ無い。

Pythonコードでの読み込みと結果

import yaml

with open('folded_example.yaml', 'r', encoding='utf-8') as file:
    data = yaml.safe_load(file)

print(data['text'])

出力結果

吾輩は猫である。 名前はまだ無い。

修飾子による制御

さらに細かい制御が必要な場合には修飾子(- や +)を使います。

記法 説明 出力例
|- 最後の改行を削除 吾輩は猫である。\n名前はまだ無い。
|+ 最後に空行が追加される 吾輩は猫である。\n名前はまだ無い。\n\n
>- 改行をスペースに置換し、最後の改行を削除 吾輩は猫である。 名前はまだ無い。
>+ 改行をスペースに置換し、最後に空行追加 吾輩は猫である。 名前はまだ無い。\n\n

サンプルコードまとめ

以下のような複数行データの例があります:

text1: |
  吾輩は猫である。
  名前はまだ無い。

text2: >-
  吾輩は猫である。
  名前はまだ無い。

Pythonコードでは次のように扱えます:

with open('multiline_example.yaml', 'r', encoding='utf-8') as file:
    data = yaml.safe_load(file)

print(data['text1'])  # 改行あり
print(data['text2'])  # 改行なし(スペース)

注意点とベストプラクティス

  1. 安全性:
  • yaml.safe_load() を使用することで、悪意あるコードが実行されるリスクを軽減できます。
  • yaml.load() は非推奨です。
  1. エンコーディング:
  • 日本語など非ASCII文字が含まれる場合は必ず encoding='utf-8' を指定してください。
  1. 適切なスタイル選択:
  • 改行が重要な場合にはリテラルスタイル(|)を、それ以外の場合には折りたたみスタイル(>)を選択しましょう。

以上がPythonでYAMLファイルを扱う方法と複数行データの記述方法です。PyYAMLの柔軟性と簡潔さを活用して効率的に設定ファイルや構造化データを扱ってみてください!

Python