0

yaml ファイルを特定の形式に変換しようとしています。YAML ファイルは次のようになります。

treeroot:
    branch1:
        name: 1
        branch1-1:
            name: 2
    branch2:
        name: 3
        branch2-1:
            name: 4

上記のファイルを入力として取得し、次の形式で出力したいと思います。

system.treeroot.branch1.name 1
system.treeroot.branch1.branch1-1.name 2
system.treeroot.branch2.name 3
system.treeroot.branch2.branch2-1.name 4

ここに私が書いたコードがあります:

#!/usr/bin/python

import yaml
m = "system"
def main():
    yaml_data = yaml.load(open('test.yaml'))
    recurse(yaml_data)

def recurse(yaml_data):
    for k,v in yaml_data.iteritems():
        global m
        if type(v) == type({}):
            m = m + "." + k
            recurse(v)
        else:
            m = m + "." + k
            print str(m)+" "+str(v)

if __name__ == "__main__":
    main()

しかし、このコードが出力する出力は次のようなものです。

system.treeroot.branch2.branch2-1.name 4
system.treeroot.branch2.branch2-1.name.name 3
system.treeroot.branch2.branch2-1.name.name.branch1.branch1-1.name 2
system.treeroot.branch2.branch2-1.name.name.branch1.branch1-1.name.name 1

どうすれば問題を解決できますか?

4

1 に答える 1

1

まず、スタイルに関する注意です。isinstanceタイプを直接比較するよりも、を使用することをお勧めしますif isinstance(v, dict):

global をいじろうとする代わりに、関数に 2 つの引数をとらせればm、問題は解決するはずです。

def recurse(yaml_data, m):
    for k,v in yaml_data.iteritems():
        if isinstance(v, dict):
            # m = m + "." + k
            recurse(v, m + "." + k)
        else:
            m = m + "." + k
            print str(m)+ " " +str(v)

# In [4]: recurse(yaml_data, 'system')
# system.treeroot.branch2.branch2-1.name 4
# system.treeroot.branch2.name 3
# system.treeroot.branch1.branch1-1.name 2
# system.treeroot.branch1.name 1
于 2013-08-08T21:29:11.487 に答える