YAMLの扱い
Table of contents
PyYAMLのインストール
Pythonでは標準ライブラリにYAML処理のためのライブラリが用意されていない。
このページの例ではPythonにおけるYAML処理で一番メジャー(だと思われる)PyYAMLを使った例を紹介する。
PyYAMLはPyPIパッケージ名 pyyaml
なので以下のコマンドでインストールできる。( $
はシェルを意味してるので、入力する必要はないことに注意。)
$ pip install pyyaml
また環境によっては sudo
でシステム全体にインストールしたいこともあるかも。
$ sudo pip install pyyaml
PythonデータをYAMLにする(エンコード)
yaml.dump()
関数を使う。
import yaml # PyYAMLのインポート
v1 = 100
yaml_str1 = yaml.dump(v1)
print(yaml_str1) #=> '100\n...\n'
v2 = "もじれつ"
yaml_str2 = yaml.dump(v2)
print(yaml_str2) #=> '"\\u3082\\u3058\\u308C\\u3064"\n'
v3 = "もじれつです"
yaml_str3 = yaml.dump(v3, allow_unicode=True)
print(yaml_str3)
#=> 'もじれつ\n...\n'
# allow_unicode=True で非ASCII文字をunicode code point表記にしない
v4 = [123, "abc"]
yaml_str4 = yaml.dump(v4)
print(yaml_str4)
#=> '- 123\n- abc\n'
# 以下のような感じ
# - 123
# - abc
v5 = {"key1": "value1", "key2": 1234}
yaml_str5 = yaml.dump(v5)
print(yaml_str5)
#=> 'key1: value1\nkey2: 1234\n'
# 以下のような感じ
# key1: value1
# key2: 1234
v6 = {"key1": 123, "key2": False, "key3": [10, 20, 30], "key4": {"key4_1": "ほげ", "key4_2": "ほげほげ"}}
yaml_str6 = yaml.dump(v6, allow_unicode=True)
# 以下のような感じ
# key1: 123
# key2: false
# key3:
# - 10
# - 20
# - 30
# key4:
# key4_1: ほげ
# key4_2: ほげほげ
YAML文字列をPythonデータにする(デコード)
yaml.safe_load()
または Loader
を指定して yaml.load()
関数を使う。
設定ファイルやJSON相当のデータ構造をparseするような用途では safe_load()
を使えばとくに問題はないと思われる。
import yaml
yaml1 = """
1
"""
v1 = yaml.load(yaml1, Loader=yaml.SafeLoader)
#=> 1
# 過去のバージョンのセキュリティ上の問題からSafeLoaderを指定する必要がある
# PyYAMLの直近のバージョンではLoader指定なしでの呼び出しはTypeErrorになるようになっているようだ
# (以前はWarningが出るだけだった)
v1_2 = yaml.load(yaml1, Loader=yaml.CSafeLoader)
# CSafeLoaderを指定すると lib-yaml のネイティブ実装を使ってパースする
# 非常に大きなYAMLデータの処理や、何回も実行する場合などに実行時パフォーマンスのメリットがあるかもしれない
yaml2 = """
key1: abc
key2:
- 1
- 2
- 3
"""
v2 = yaml.safe_load(yaml2)
#=> {"key1": "abc", "key2": [1, 2, 3]}
# Loader=yaml.SafeLoader を指定したのと同じ
エンコードしつつfileオブジェクトににYAMLを出力
yaml.dump()
関数の第一引数にシリアライズしたいデータを、第二引数にファイルオブジェクト(また同様に振る舞うオブジェクト)を指定して書き出すことができる。
import yaml
data = {'key1': 123, 'key2': False, 'key3': [10, 20, 30], 'key4': {'key4_1': 'ほげ', 'key4_2': 'ほげほげ'}}
with open("/tmp/hoge.yaml", "w") as fh:
yaml.dump(data, fh)
# /tmp/hoge.yaml は以下のような内容になる:
#
# key1: 123
# key2: false
# key3:
# - 10
# - 20
# - 30
# key4:
# key4_1: "\u307B\u3052"
# key4_2: "\u307B\u3052\u307B\u3052"
# allow_unicode=True を使って非ASCII文字をそのまま出力(UTF-8エンコーディング)
with open("/tmp/hoge_nihongo_sonomama.yaml", "w") as fh:
yaml.dump(data, fh, allow_unicode=True)
# /tmp/hoge_nihongo_sonomama.yaml は以下のような内容:
#
# key1: 123
# key2: false
# key3:
# - 10
# - 20
# - 30
# key4:
# key4_1: ほげ
# key4_2: ほげほげ
fileオブジェクトからYAMLを読み込んでデコード
yaml.load()
関数は文字列だけではなくファイルオブジェクト(または同様に振る舞うオブジェクト)を指定することでファイルやソケットのストリームからYAMLを読み込んでデコードすることもできる。
import yaml
# /tmp/hoge.yaml に以下のようなファイルを用意
# key1: 999
# key2: true
# key3:
# - 111
# - 222
# - 333
# key4:
# key4_1: あかさたな
# key4_2: ハマヤラワ
with open("/tmp/hoge.yaml") as fh:
data = yaml.load(fh)
#=> {'key1': 999, 'key2': True, 'key3': [111, 222, 333], 'key4': {'key4_1': 'あかさたな', 'key4_2': 'ハマヤラワ'}}