Python で YAML を読み書きするには、PyYAML というパッケージがある。
というわけで、忘れないようにメモ。
インストールは、ほかのパッケージと同様、pip でインストールできる。
^o^ > pip install pyyaml Downloading/unpacking pyyaml Downloading PyYAML-3.10.tar.gz (241kB): 241kB downloaded Running setup.py egg_info for package pyyaml Installing collected packages: pyyaml Running setup.py install for pyyaml checking if libyaml is compilable Unable to find vcvarsall.bat skipping build_ext Successfully installed pyyaml Cleaning up...
まずはサンプルのYAMLファイルを用意する。
^o^ > type sample_dict.yaml Python: Guido Ruby: Matz Perl: Larry
YAMLの読み込み
yaml.load関数を使う。
>>> import yaml >>> f = open('sample_dict.yaml', 'r') >>> data = yaml.load(f) >>> f.close() >>> data {'Python': 'Guido', 'Ruby': 'Matz', 'Perl': 'Larry'} >>> type(data) <type 'dict'>
ちゃんと辞書型のデータになっているのがわかる。ファイルオブジェクトを作らなきゃいけないのが Ruby と比べてちょっと面倒だな。
あ、それから、インポートするのは、pyyaml じゃなくて yaml ね。
YAMLの書き出し
書き出すときには、yaml.dump関数。文字列が返ってくるので、これもやっぱりファイルオブジェクトを使ってファイルに書き出す。
>>> f = open('sample_dict2.yaml', 'w') >>> f.write(yaml.dump(data)) >>> f.close() >>> exit() ^o^ > type sample_dict2.yaml {Perl: Larry, Python: Guido, Ruby: Matz}
ふむ、辞書(YAMLではマップって言うんだっけ?)のフォーマットが読み込んだファイルとは違うな。PyYAMLではこういうフォーマットにしかならないんだろうか。
リストの場合
リストでも試してみよう。
^o^ > type sample_list.yaml - Python - Ruby - Perl
読み込み:
>>> import yaml >>> f = open('sample_list.yaml', 'r') >>> data = yaml.load(f) >>> f.close() >>> data ['Python', 'Ruby', 'Perl'] >>> type(data) <type 'list'>
書き出し:
>>> f = open('sample_list2.yaml', 'w') >>> f.write(yaml.dump(data)) >>> f.close() >>> exit() ^o^ > type sample_list2.yaml [Python, Ruby, Perl]
やっぱりフォーマットが違う。
まあ、データの量とかも関係があるのかも。何百行にもなるようなリストを上のようなフォーマットで出力されたら見難くてしょうがない。