在python中获取yaml键值

SJJ*_*SJJ 5 python python-2.7

我的 yaml 文件是:

clusters:
    test:                           
      tag_cl: tag0
    mtest:                           
      tag_cl: tag1, tag12
    ctest3:                           
      tag_cl: tag2, tag22
Run Code Online (Sandbox Code Playgroud)

我想获得每个的价值tag_cl。我期待以下输出:

tag0
tag1, tag12
tag2, tage22
Run Code Online (Sandbox Code Playgroud)

我尝试这样做:

stream = open('clusters.yml', 'r')
data = yaml.load(stream)
var = data.get('clusters').get('test').get('tag_cl')
Run Code Online (Sandbox Code Playgroud)

只是想知道是否有一种方法可以代替*get('test')以便我可以为所有人获取它。

请帮忙

Apo*_*020 6

您可以像这样使用递归生成器:

import yaml

def find(d, tag):
    if tag in d:
        yield d[tag]
    for k, v in d.items():
        if isinstance(v, dict):
            for i in find(v, tag):
                yield i

stream = open('clusters.yml', 'r')
data = yaml.load(stream)

for val in find(data, 'tag_cl'):
    print val
Run Code Online (Sandbox Code Playgroud)

这将返回与与指定标签匹配的所有键关联的值,无论嵌套深度如何(在合理范围内)。


Moo*_*sez 5

data是一个Python字典。data您可以通过作为字典进行迭代来检索所有数据。请注意,您还可以使用而["clusters"]不是访问 python 字典.get("clusters")

你会做类似的事情:

for k, v in data["clusters"].items():
    print data["clusters"][k]["tag_cl"]
Run Code Online (Sandbox Code Playgroud)

编辑

如果你想检查"tag_cl"中是否有 key data,可以使用以下.has_key()方法:

for k, v in data["clusters"].items():
    if data["clusters"][k].has_key("tag_cl"):
        print data["clusters"][k]["tag_cl"]
Run Code Online (Sandbox Code Playgroud)