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']) # 改行なし(スペース)
注意点とベストプラクティス
- 安全性:
- yaml.safe_load() を使用することで、悪意あるコードが実行されるリスクを軽減できます。
- yaml.load() は非推奨です。
- エンコーディング:
- 日本語など非ASCII文字が含まれる場合は必ず encoding='utf-8' を指定してください。
- 適切なスタイル選択:
- 改行が重要な場合にはリテラルスタイル(|)を、それ以外の場合には折りたたみスタイル(>)を選択しましょう。
以上がPythonでYAMLファイルを扱う方法と複数行データの記述方法です。PyYAMLの柔軟性と簡潔さを活用して効率的に設定ファイルや構造化データを扱ってみてください!