プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

ruamel.yamlによるYAMLの処理

ruamel.yamlとPyYAML

PythonYAMLを扱うには選択肢が2つある。

  1. PyYAML
  2. ruamel.yaml

今日時点で有名なのはPyYAMLの方だがアップデートが収束しつつあるのが懸念材料だ。

ruamel.yamlはPyYAMLのフォークだ。ruamel.yamlは熱心にアップデートされておりPyYAMLよりも細かい使い勝手が向上している。

比較

PyYAMLに対するruamel.yamlの大きな利点は以下の2点だろう。

  • YAML 1.2対応(後述)
  • コメントの読み込み

コメントを読み込めるのは興味深い。YAMLで記述された設定ファイルにはコメントが記載されている可能性が高い。大量の設定ファイルを一括変換したいけどsed仙人がいない!というときにはruamel.yamlが役立ちそうだ。

本記事ではruamel.yamlを取り上げる。PyYAMLは取り上げないがここで紹介するような簡単な処理ならPyYAMLもほとんど同じだ。


YAML 1.2対応

ruamel.yamlYAML 1.2に正式対応している。

一方、PyYAMLのYAML 1.2対応については情報が錯綜している。未対応というサイトもあれば対応しているというサイトもある。以下の点から対応していないと考えるのが妥当だろう。

  • PyYAMLのGitHubのIssue「YAML 1.2 support #116」が今日時点でOpen
  • ruamel.yamlの公式ページにおいてPyYAMLとの違いとして挙げられている

インストール

  • pipかpipenvでインストールする
$ pipenv install ruamel.yaml

import

from ruamel import yaml

読み込む

    with open('test.yaml', 'r') as stream:
        yaml_data = yaml.safe_load(stream)

書き込む

with open('test.yaml', 'w') as stream:
    yaml.dump(yaml_data, stream=stream)

Iterate

  • 第1階層のキーのみを表示する
  • 第2階層以下を表示したい場合はfor文をネストすること
    for key in yaml_data:
        print(key)

要素へのアクセス

  • YAMLのデータ型はほぼそのままPythonに変換される
  • 以下に変換規則を一部記載する
YAMLの型 Pythonの型
マッピング dict
シーケンス list
文字列 str
整数 int
真偽値 bool
null None
  • 変換されたPythonのデータとして処理すればOK

  • アクセス例

print(yaml_data['id'])