在python中获取yaml键值

2024-06-25 07:59:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我的yaml文件是:

clusters:
    test:                           
      tag_cl: tag0
    mtest:                           
      tag_cl: tag1, tag12
    ctest3:                           
      tag_cl: tag2, tag22

我想得到每个tag_cl的值。我期望得到以下输出:

tag0
tag1, tag12
tag2, tage22

我试着做:

stream = open('clusters.yml', 'r')
data = yaml.load(stream)
var = data.get('clusters').get('test').get('tag_cl')

只是想知道是否有办法让*而不是get('test'),这样我就可以为所有人获取它。

请帮忙


Tags: 文件testyamldatastreamgetcltag
3条回答

以下是我发现的:

In[17]: d
Out[17]: 
{'clusters': {'ctest3': {'tag_cl': 'tag2, tag22'},
  'mtest': {'tag_cl': 'tag1, tag12'},
  'test': {'tag_cl': 'tag0'}}}

In[18]: d['clusters']
Out[18]: 
{'ctest3': {'tag_cl': 'tag2, tag22'},
 'mtest': {'tag_cl': 'tag1, tag12'},
 'test': {'tag_cl': 'tag0'}}

In[19]: for it in d['clusters'].items():
    print('{} ==> {}'.format(*it))

ctest3 ==> {'tag_cl': 'tag2, tag22'}
test ==> {'tag_cl': 'tag0'}
mtest ==> {'tag_cl': 'tag1, tag12'}

In[20]: [v for v in d['clusters'].values()]
Out[20]: [{'tag_cl': 'tag2, tag22'}, {'tag_cl': 'tag0'}, {'tag_cl': 'tag1, tag12'}]

In[21]: [v['tag_cl'] for v in d['clusters'].values()]
Out[21]: ['tag2, tag22', 'tag0', 'tag1, tag12']

注释

  • 第17行:我们的字典是d
  • 第18行:大多数好东西都在d['clusters']
  • 第19行:探索:我们想要的东西在d['clusters'].items()
  • 第20行:具体来说,它们在d['clusters'].values()中。越来越近了。
  • 第21行:宾果。

可以使用递归生成器,如下所示:

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

这将返回与与指定标记匹配的所有键相关联的值,而不考虑嵌套深度(在合理范围内)。

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

你要做的是:

for k, v in data["clusters"].items():
    print data["clusters"][k]["tag_cl"]

编辑

如果要检查data中是否有"tag_cl"键,可以使用.has_key()方法:

for k, v in data["clusters"].items():
    if data["clusters"][k].has_key("tag_cl"):
        print data["clusters"][k]["tag_cl"]

相关问题 更多 >