2013/06/30

ライブラリ:PyYAML

Pythonの「PyYAML」というライブラリについてご紹介します。

import yaml

「PyYAML」(ライブラリとしてimportするときは「yaml」)は、YAML形式のデータを扱うためのライブラリです。

YAMLはXMLやJSONと比べるとシンプルなので自分の手でparseするのでもさほど大変ではないかとは思いますが、やはり、ライブラリを使うのが早くて確実かと思います。

PyYAMLには大きく2つの機能――読み込みと書き込みとがあります。以下、順に見ていきます。

YAMLデータの読み込み

import yaml

FILEIN_DICT = "sample_dict.yaml"

f = open(FILEIN_DICT, 'r')
data = yaml.load(f)  # 読み込む
f.close()
YAML形式のデータを読み込むには、yaml.load()を使います。引数には、読み込みモードで開いたファイルオブジェクトを渡します。

以下、「sample_dict.yaml」の中身が次のとおりだと仮定して見てみます。
# dict
name: Takeda Shingen
sex: male
class: Daimyo
region: Kai
year: [1521, 1573]
nickname:
- Kazchiyo
- Kai no tora
YAMLに馴染みがなくてYAMLの文法がよくわからない、という方は、公式サイト(この投稿を書いている時点での最新版は1.2です)Wikipediaのページを参照いただくとよいかと思います。

print type(data).__name__  # dict
トップの階層がハッシュ形式となっているデータを読み込んだときは、load()で生成されるのは辞書型の変数です。

import pprint
pprint.pprint(data)
# 次のとおり出力される
# {'class': 'Daimyo',
#  'name': 'Takeda Shingen',
#  'nickname': ['Kazchiyo', 'Kai no tora'],
#  'region': 'Kai',
#  'sex': 'male',
#  'year': [1521, 1573]}
中身は通常の辞書型のデータになっています。バリューにリストがある場合は、それもPythonのリストとして格納されます。

ここでpprint.pprint()というのを使っていますが、これは変数の中身を整形して表示するためのもので、yamlとは関係ありません(pprintも使うにはインストールが必要です)。

次に、トップの階層がリストになっているデータの場合を見てみます。こちらも基本的にはハッシュと同じです。
FILEIN_DICT = "sample_list.yaml"

f = open(FILEIN_LIST, 'r')
data = yaml.load(f)  # 読み込む
f.close()

「sample_list.yaml」の中身は次のとおりとします。
# list
- C
- Java
- Python
- Ruby
- name: Japanese
  region: Japan
- {name: Kagoshima-ben, region: Kagoshima}

print type(data).__name__  # list
こちらはリストに格納されます。

import pprint
pprint.pprint(data)
# 次のとおり表示
# ['C',
#  'Java',
#  'Python',
#  'Ruby',
#  {'name': 'Japanese', 'region': 'Japan'},
#  {'name': 'Kagoshima-ben', 'region': 'Kagoshima'}]
ハッシュ型と同じく、ノードとしてリストやハッシュを含む場合は、それら子孫ノードもリストや辞書として格納してくれます。

続いて、書き込みの方を。書き込みといっても、文字列に展開する機能だけです。

YAMLデータの書き込み

mylist = {'dogs': ['pochi', 'taro', 'kai'],
          'cats': ['shimajiro', 'tyson']}

f = open('out.yaml', 'w')
f.write(yaml.dump(mylist))  # 書き込む
f.close()
書き込みは、yaml.dump()で行います。dumpで生成されるのは文字列なため、ファイルに書き込む場合は別途ファイルオブジェクトを用意して書き込みます。

最後のもうひとつ、型について少しだけ見てみます。

型の指定

YAMLでは「!!int」といった「タグ」を各ノードの付ける(付記する)ことによって、型の指定ができるようです。私自身使ったことはないのですが、たとえば
  • YAML Python
  • !!null None
  • !!float float
  • !!set set
といったように、YAMLでのタグとPython型との間で対応しているそうなので、型をしっかり見て使う場合なんかには公式ドキュメントの該当するパートをごらんいただくのがよいかと思います。

以上です。


インストール
「pip」が入っていれば、「pip install pyyaml」でインストールすることができます。


参考
PyYAML - PyPI
PyYAMLDocumentation - PyYAML
python - Best way to parse a YAML file - Stack Overflow
YAML - ウィキペディア

0 件のコメント: