PyYAML 3.0.8
いろんなフレームワークで設定ファイルなどに採用されているので、PythonでYAMLを読んでみる。
おそらくメジャーどころのYAML用モジュールとしてはSyckを利用するPySyckもありますが、PyYAMLというのもあります。
ちなみに実際にインポートするパッケージ名は
- PyYAMLだとyaml
- PySyckだとsyck
です。
両方ともload()とdump()というかたちで入出力を実装しているので、扱い方はほとんど一緒かなと。
とりあえず読む
load()の第一引数にYAML形式の文字列か、file型を読み込めます。
ただしfileの場合は
のエンコードで記述してある必要があるとのこと。
こうしてファイルから読み込んだ場合、マルチバイト文字列はUnicodeになります。
オプションですがキーワード引数で
とすればYAMLのパースにCで書かれたLibYAMLを利用するとのことなので、デフォルトのパーサの実装まで見てませんがそれがPurePythonなら、速度が向上すると思われます。
yaml.load(file, Loader=yaml.CLoader)
単純な例だとこんな感じ。
>>> 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
モロにこういう内容が書き出されるわけで・・・、多分別の実装からでは読み込めないんじゃないかなーと。
["\u65E5\u672C\u8A9E"][!!python/str "\u65E5\u672C\u8A9E"]
YAMLをプログラムから書き出すなんてあまりすることはないと思いますが、もうちょっとスマートなやり方とかないんでしょうかね。