【问题标题】:Get yaml key value in python在python中获取yaml键值
【发布时间】:2016-06-04 14:09:14
【问题描述】:

我的 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'),以便我可以为所有人获取它。

请帮忙

【问题讨论】:

标签: python python-2.7


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    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"]
    

    【讨论】:

    • 太好了,效果很好。如果 [k] 中的某些项目没有 tag_cl 怎么办??
    • @SJJ 你可以添加一个if 语句来检查是否有,我会更新我的帖子。
    • 太棒了!像魅力一样工作。谢谢! :)
    • 如何打印“test:”、“mtest:”、“ctest3:”?
    • @SJJ 请阅读dictionaries 上的python 文档。你会使用.keys()
    【解决方案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 行:宾果游戏。

    【讨论】:

    • 我需要编写脚本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多