yaml

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

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

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 というキーの下には、HOSTPORT の情報を持っており、それぞれの値が何であるのかというような階層構造を簡単に表現できます。また、YAML ではインデントを使ってデータの階層構造を表し、XML のような終了タグもないので、書きやすくかつ読みやすいです。

YAML は各種設定ファイル、ログ、データ保存など色々な用途で使用されます。Python でYAMLファイルを扱う場合には、PyYAML というライブラリを使用します。

この記事では、PyYAML を使って YAML ファイルを扱う方法を紹介します。

Python の設定ファイル管理では、INI ファイルもよく使用されており、configparser で管理します。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 を使用するには 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 の辞書として読み込みが行われるため、簡単に設定情報にアクセスすることが可能です。

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

また、PyYAML 6.0 では、Loader 引数の指定は必須となっており、指定しない場合はエラーとなります。

まとめ

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

YAML は各種設定ファイル、ログ、データ保存等いろいろな用途で使用できます。PyYAML の使い方を覚えて YAML ファイルを有効活用してください。

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

ソースコード

上記で紹介しているソースコードについては GitHub にて公開しています。参考にしていただければと思います。

あわせて読みたい
【Python Tech】プログラミングガイド
【Python Tech】プログラミングガイド
ABOUT ME
ホッシー
ホッシー
システムエンジニア
はじめまして。当サイトをご覧いただきありがとうございます。 私は製造業のメーカーで、DX推進や業務システムの設計・開発・導入を担当しているシステムエンジニアです。これまでに転職も経験しており、以前は大手電機メーカーでシステム開発に携わっていました。

プログラミング言語はこれまでC、C++、JAVA等を扱ってきましたが、最近では特に機械学習等の分析でも注目されているPythonについてとても興味をもって取り組んでいます。これまでの経験をもとに、Pythonに興味を持つ方のお役に立てるような情報を発信していきたいと思います。どうぞよろしくお願いいたします。

※キャラクターデザイン:ゼイルン様
記事URLをコピーしました