Python 解析 yaml 文件 [已关闭]

Python parse yaml file [closed]

提问人:macder 提问时间:9/22/2023 更新时间:9/22/2023 访问量:58

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2个月前关闭。

我有 yaml 文件,我想获取一组特定的键值对。我该怎么做?

DEV:
  A: "A_DEV_config.xml"
  B: "B_DEV_config.xml"
  C: "C_DEV_config.xml"
PROD:
  D: "D_PROD_config.xml"
  E: "E_PROD_config.xml"
  F: "E_PROD_config.xml"
OTHERS:
  G: "G_config.xml"
  H: "H_config.xml"
  K: "K_config.xml"

我想得到这样的东西:

if I check DEV == true:

output list of keys ->  A,B,C,G,H,K

if I check PROD == true:

output list of keys ->  D,E,F,G,H,K

您可能已经注意到,在这两种情况下我都需要得到。OTHERS

我尝试使用代码:

stream = open(yml_file, 'r')
data = yaml.safe_load(stream)
print(data.get("DEV").keys())

但我不知道如何将它们连接在一起

python yaml 键值

评论

0赞 Itération 122442 9/22/2023
在代码中,您没有读到 OTHERS 键。
0赞 macder 9/22/2023
@Itération122442是的,因为我不知道如何让 DEV + OTHERS 在一起
1赞 Daviid 9/22/2023
你不能,怎么会知道你也想要,就做和。走这种捷径有什么意义?data.get("DEV")OTHERSdata.get("DEV")data.get("OTHERS")
0赞 macder 9/22/2023
如果对我有帮助,我可以更改 yaml 文件的结构并添加像配置文件一样的顶层:[DEV、PROD、OTHERS]

答:

0赞 jmsm1g19 9/22/2023 #1

要将密钥(DEV 或 PROD)与 OTHERS 部分中的密钥连接起来,您需要定义一个函数来根据环境获取密钥,并以任何一种方式与 OTHERS 连接。

下面我写了一个函数:

import yaml

with open(yml_file, 'r') as stream:
    data = yaml.safe_load(stream)

def get_keys(environment):
    env_keys = list(data.get(environment, {}).keys())
    others_keys = list(data.get("OTHERS", {}).keys())
    return env_keys + others_keys

if DEV == True:
    print(get_keys("DEV"))
elif PROD == True:
    print(get_keys("PROD"))

希望这有帮助!

评论

0赞 macder 9/22/2023
太好了,谢谢。它对我有用
1赞 Codist 9/22/2023 #2

对于此特定用例,您需要显式引用 OTHERS,因为您的查找是“PROD”,并且您希望将其包含在“OTHERS”中。您可以这样做:

import yaml

def process(filename, key):
    with open(filename) as y:
        data = yaml.safe_load(y)
        return list(data[key]) + list(data['OTHERS'])

for key in 'DEV', 'PROD':
    print(*process('foo.yml', key), sep=',')

输出:

A,B,C,G,H,K
D,E,F,G,H,K

另一种方法是获取除指定密钥之外的所有密钥的相关项目 - 即,您可以说“我想要除'DEV'之外的所有内容”,在这种情况下:

import yaml

def process(filename, key):
    with open(filename) as y:
        data = yaml.safe_load(y)
        output = []
        for _key in set(data) - {key}
            output.extend(data[_key])
        return output

for key in 'DEV', 'PROD':
    print(*process('foo.yml', key), sep=',')

输出:

D,E,F,G,H,K
A,B,C,G,H,K