yaml

【Python】PyYAMLでのYAMLファイル管理

【Python】PyYAMLでのYAMLファイル管理

PythonでYAMLファイルの管理をする際に使用するPyYAMLの基本的な使い方について解説します。

PyYAMLでのYAMLファイル管理

YAMLファイルは、YAML Ain’t Markup Languageファイルのことで、XMLやjsonと同じように構造化されたデータを表現するためのフォーマットです。

拡張子は「.yml」または「.yaml」です。正式な拡張して押しては.yamlですが、拡張子は一般的に3文字のものが多く使われるため.ymlが使用されることが多いようです。

YAMLファイルの簡単な例は以下になります。

DB_SERVER:
  HOST: 192.168.1.200
  PORT: 3306
WEB_SERVER:
  HOST: 192.168.1.100
  PORT: 80

YAMLファイルでは、キー: 値の形式になっており、上記のように例えばDB_SERVERというキーの下には、HOSTとPORTの情報を持っており、それぞれの値が何であるのかというような階層構造を簡単に表現できます。また、YAMLではインデントを使ってデータの階層構造を表し、XMLのような終了タグもないので、非常に書きやすくかつ読みやすくなっています。

YAMLは各種設定ファイル、ログ、データ保存等いろいろな用途で使用されます。PythonでYAMLファイルを扱いたい場合には、PyYAMLというライブラリを使用することができます。

本記事では、PyYAMLを使ってYAMLファイルを扱う方法を紹介します。具体的には、設定ファイルでYAMLファイルを使用することを例に入出力の基本を説明します。

なお、設定ファイルの管理という意味ではconfigparserによる方法もあります。「configparserによる設定ファイル管理」でまとめていますので興味があれば参考にしてください。

PyYAMLのインストール

PyYAMLを使用するにはインストールが必要です。以下のようにpipでインストールをしてください。

 pip install pyyaml

PyYAMLの基本的な使い方

PyYAMLの基本的な使い方を以降で紹介します。なお、PyYAMLのバージョンは記事更新時点のPyYAML 6.0で確認をしています。バージョンによっては挙動が異なる場合があることはあらかじめご了承ください。

PyYAMLを用いてYAMLファイルの入出力をする場合には、以下のように使用します。

import yaml

yaml_data = {
    "WEB_SERVER": {"HOST": "192.168.1.100", "PORT": 80},
    "DB_SERVER": {"HOST": "192.168.1.200", "PORT": 3306},
}

# YAMLファイルの書き込み
with open("config.yml", "w") as yml_file:
    # 書き込み
    yaml.dump(yaml_data, yml_file)

# YAMLファイルの読み込み
with open("config.yml", "r") as yml_file1:
    # 読み込み
    load_data = yaml.load(yml_file1, Loader=yaml.SafeLoader)

print(type(load_data))
# 読み込んだ結果の参照
print(load_data["WEB_SERVER"])
print(load_data["WEB_SERVER"]["HOST"])
print(load_data["WEB_SERVER"]["PORT"])
print(load_data["DB_SERVER"])
print(load_data["DB_SERVER"]["HOST"])
print(load_data["DB_SERVER"]["PORT"])
【実行結果】
<class 'dict'>
{'HOST': '192.168.1.100', 'PORT': 80}
192.168.1.100
80
{'HOST': '192.168.1.200', 'PORT': 3306}
192.168.1.200
3306
【出力結果ファイル config.yml の内容】
DB_SERVER:
  HOST: 192.168.1.200
  PORT: 3306
WEB_SERVER:
  HOST: 192.168.1.100
  PORT: 80

上記では、YAMLファイルに書き込む辞書データを用意しYAMLファイルのconfig.ymlへ書き込みします。その後書き込んだYAMLファイルを読み込んで表示するといったことをしています。

以降で書き込み・読み込み部分のそれぞれについて見ていきましょう。

YAMLファイルの書き込み

PyYAMLを用いてファイルを書き込む場合には以下のようにします。

import yaml

yaml_data = {
    "WEB_SERVER": {"HOST": "192.168.1.100", "PORT": 80},
    "DB_SERVER": {"HOST": "192.168.1.200", "PORT": 3306},
}

# YAMLファイルの書き込み
with open("config.yml", "w") as yml_file:
    # 書き込み
    yaml.dump(yaml_data, yml_file)

まず、PyYAMLを使用するには「import yaml」でインポートが必要です。

書き込むデータは辞書形式で用意し、YAMLファイルへの書き込みを行う場合には、dump関数に書き込み対象の辞書を渡すことで簡単に書き込みを行うことができます。

YAMLファイルの読み込み

PyYAMLでファイルを読み込む場合には以下のようにします。

# YAMLファイルの読み込み
with open("config.yml", "r") as yml_file1:
    # 読み込み
    load_data = yaml.load(yml_file1, Loader=yaml.SafeLoader)

YAMLファイルの読み込みを行う場合には、上記のようにload関数を使用します。load関数にはファイルオブジェクトとLoader引数で読み込み用のローダーを指定します。上記例では、yaml.SafeLoaderを指定しています。

なお、Loader=yaml.SafeLoaderを省略したsafe_load関数をload関数の代わりに使っても構いません。

# YAMLファイルの読み込み
with open("config.yml", "r") as yml_file1:
    # 読み込み
    load_data = yaml.safe_load(yml_file1)

なお、Loaderには種類がありますが、SafeLoaderは信頼できないデータソースを読み込みで推奨されるものですので基本こちらを使用するでよいのかなと思っています。

print(type(load_data))
# 読み込んだ結果の参照
print(load_data["WEB_SERVER"])
print(load_data["WEB_SERVER"]["HOST"])
print(load_data["WEB_SERVER"]["PORT"])
print(load_data["DB_SERVER"])
print(load_data["DB_SERVER"]["HOST"])
print(load_data["DB_SERVER"]["PORT"])

上記の部分で読み込んだデータを確認していますが、load関数ではPythonの辞書(dict)として読み込みが行われます。そのため、辞書として簡単に情報にアクセスすることが可能です。

Note

5.1より前のバージョンであればyaml.load(yml_file)のようにYAMLファイルを読み込みが可能でしたがセキュリティ上の理由から非推奨になり、5.1以降だとLoader=を設定しないと以下のような警告が発生します。

YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(yml_file1)

この警告に関連する詳細は警告内容にも記載のあるこちらのページを参照してください。

記事更新時点で確認したPyYAML6.0だとLoader引数の指定は必須になったようで、指定しない場合はエラーとなります。

TypeError: load() missing 1 required positional argument: 'Loader'

まとめ

PythonでYAMLファイルの管理をする際に使用するPyYAMLの基本的な使い方について解説しました。

YAMLは各種設定ファイル、ログ、データ保存等いろいろな用途で使用されます。是非PyYAMLの使い方を覚えてYAMLファイルを使ってみてもらえればなと思います。

Note

PyYamlの公式ドキュメントはこちらを参照してください。