我的 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')
以便我可以为所有人获取它。
请帮忙
您可以像这样使用递归生成器:
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)
这将返回与与指定标签匹配的所有键关联的值,无论嵌套深度如何(在合理范围内)。
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)