PyYAML 3.0.8

いろんなフレームワークで設定ファイルなどに採用されているので、PythonYAMLを読んでみる。

おそらくメジャーどころのYAML用モジュールとしてはSyckを利用するPySyckもありますが、PyYAMLというのもあります。

ちなみに実際にインポートするパッケージ名は

  • PyYAMLだとyaml
  • PySyckだとsyck

です。

両方ともload()とdump()というかたちで入出力を実装しているので、扱い方はほとんど一緒かなと。

とりあえず読む

load()の第一引数にYAML形式の文字列か、file型を読み込めます。
ただしfileの場合は

エンコードで記述してある必要があるとのこと。
こうしてファイルから読み込んだ場合、マルチバイト文字列はUnicodeになります。

オプションですがキーワード引数で


yaml.load(file, Loader=yaml.CLoader)
とすればYAMLのパースにCで書かれたLibYAMLを利用するとのことなので、デフォルトのパーサの実装まで見てませんがそれがPurePythonなら、速度が向上すると思われます。

単純な例だとこんな感じ。


>>> import yaml
>>> src = yaml.load('hoge: [ [1,2,3], [a,b,c], {foo: FOO,bar: BAR}]')
>>> type(src)

>>> src
{'hoge': [[1, 2, 3], ['a', 'b', 'c'], {'foo': 'FOO', 'bar': 'BAR'}]}

書き出す

dump関数で出力できます。
単純な例だとこんな感じ。


>>> import yaml
>>> src = {'foo': [1,2,3], 'bar': {'a': 'aaa', 'b': 'bbb'}, 'baz': (11, 22)}
>>> yaml.dump(src)
'bar: {a: aaa, b: bbb}\nbaz: !!python/tuple [11, 22]\nfoo: [1, 2, 3]\n'
タプルもシリアライズされて出力されてます。オブジェクトもシリアライズしてくれるそうです。あんまり使う機会はないと思いますが。

ちなみに第2引数にファイル型をとると、そいつに出力してくれます。

ただ、マルチバイト文字列がある場合には


# -*- coding: utf-8 -*-
import yaml

hoge = [u'日本語']
print yaml.dump(hoge)

hoge = ['日本語']
print yaml.dump(hoge)

こういうコードを実行すると、

["\u65E5\u672C\u8A9E"]

[!!python/str "\u65E5\u672C\u8A9E"]

モロにこういう内容が書き出されるわけで・・・、多分別の実装からでは読み込めないんじゃないかなーと。

YAMLをプログラムから書き出すなんてあまりすることはないと思いますが、もうちょっとスマートなやり方とかないんでしょうかね。