Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

pyyamlでのYAMLの読み込みと書き込み

はじめに

PythonYAMLパーサのpyyamlを利用して、YAMLのデシリアライズシリアライズするコードスニペットと、その説明をメモしておく。

コード例

import yaml

with open('input.yml') as file:
    data = yaml.load(file, Loader=yaml.CLoader)

with open('output.yml', 'w') as file:
    yaml.dump(data, file, allow_unicode=True, default_flow_style=False, sort_keys=False)

load()によるデシリアライズ

load()の呼び出しにはLoaderの指定が必要。 指定しなくても実行できるが、以下のような警告文が出力される。

test.py:30: 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(file)

過去はLoaderの指定は不要だったようだが、インタフェースを保ちつつ脆弱性への対応を行うためにこうなったらしい。 詳細は以下を参照。

dump()によるシリアライズ

dump()で実用的なYAMLを書き出す際には、いくつかのフラグをつけておいたほうが視認性が良くなる。

  • allow_unicode

    • UNICODE文字を許すかどうか。Falseの場合は\uエンコードされた文字列が出力される。
  • default_flow_style

    • YAMLをフロースタイルで出力すると、横に長く伸びるので、視認性が悪くなる。
  • sort_keys

    • キーをソートしてその順番で出力するかどうか。登録順で出力しなたいならFalseを指定しておく。YAMLの内容がデータなら出力順序が重要ではない場合もあるが、YAML形式の設定ファイル等の場合は元の順序を保っていたほうが分かりやすい。