YAMLの読み書き

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]

やっぱりフォーマットが違う。
まあ、データの量とかも関係があるのかも。何百行にもなるようなリストを上のようなフォーマットで出力されたら見難くてしょうがない。