PyYAMLについてメモ


PyYAMLでYamlファイルを読み込んだ場合、デフォルトだと通常のDictionaryとして読み込むため、

ファイルの順序が保証されない。


例えばこんな感じのYamlファイルがあったとして、


data.yml

aaa:

  a1: 1

  a2: 2

  a3: 3

bbb:

  b1: 1

  b2: 2

  b3: 3

ccc:

  c1: 1

  c2: 2

  b3: 3

普通にyaml.loadして出力すると


yaml_load.py

import yaml


data = yaml.load(file("data.yml"))


for k1, v1 in data.items():

    for k2, v2 in v1.items():

        print("%s - %s - %s" % (k1, k2, v2))

こんな感じになる。


実行結果

aaa - a1 - 1

aaa - a3 - 3

aaa - a2 - 2

bbb - b1 - 1

bbb - b2 - 2

bbb - b3 - 3

ccc - c2 - 2

ccc - c1 - 1

ccc - b3 - 3

ファイルに記載されている通りの順序で読み込みたい場合は、OrderedDictとして読み込むようにしてやる


yaml_load.py

import yaml

from collections import OrderedDict


# これを追加する

yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,

    lambda loader, node: OrderedDict(loader.construct_pairs(node)))


data = yaml.load(file("data.yml"))


for k1, v1 in data.items():

    for k2, v2 in v1.items():

        print("%s - %s - %s" % (k1, k2, v2))

これで順序を保持して読み込める。


実行結果

aaa - a1 - 1

aaa - a2 - 2

aaa - a3 - 3

bbb - b1 - 1

bbb - b2 - 2

bbb - b3 - 3

ccc - c1 - 1

ccc - c2 - 2

ccc - b3 - 3

この辺を参考にした