【问题标题】:Dynamically manage key parsing in a YAML file with Python使用 Python 动态管理 YAML 文件中的密钥解析
【发布时间】:2020-10-11 00:59:08
【问题描述】:

我有一个需要在 Python 中解析的 YAML 文件;它是 Ansible 库存文件的骨架,每天都会发生变化;我正在编写将构建该库存文件的解析器。

假设我有这个 yaml 文件:

---
all:
  server1: ipaddr1
  server2: ipaddr2
  server3: ipaddr3
dbservers:
  server2
  server3
webgwservers:
  server1

我有以下代码 sn-p 来加载 YAML:

    environment = yaml.load(bom, Loader=yaml.SafeLoader)

        for x in environment.keys():
        key = environment[x]
        if type(key) is list:
            print(x+ ":")
            if x == 'all':
                for xx in environment['all']:
                    for k,v in xx.items():
                        print(k+":"+v)
            if x == 'infra':

现在,我希望能够列出所有顶级键('all'、'dbservers'、'webgwservers')并根据它们的类型(列表、字典等)做一些事情。问题是,我可能有 yaml 的数据——更多的顶级键。

因此,我需要一种方法来解析顶级键并获得它们的名称,而无需对这些键名进行硬编码。

【问题讨论】:

  • 我仍然不确定您要做什么。您能否提供一个示例,说明您的代码片段没有按照您的意愿执行?
  • @MustafaQuraish 我已经更新了上面的代码 sn-ps。你看到那些if x == 'all'if x == 'infra' 行了吗?我需要摆脱这些并用变量替换它们。顶层键 all、infra、dbservers 可能会被替换并添加其他键,具体取决于我是否在 Prod、Preprod、QA 等部门。我的代码不应该提前知道 YAML 文件结构。

标签: python-3.x yaml


【解决方案1】:

以某种方式修复了它,但不是很令人满意:

def createinventory(inputfile, outputfile, ansroot):
    with open(inputfile, 'r') as bom:
        environment = yaml.load(bom, Loader=yaml.SafeLoader)

        with open(ansroot + '/inventory/' + outputfile, 'w') as outfile:
            for keyname in environment.keys():
                if keyname != 'defaults' and keyname != 'dnszone':
                    key = environment[keyname]
                    #parseSubkeys(key, x, outfile)
                    outfile.write('[{}]\n'.format(keyname))
                    for xx in key:
                        for k, v in xx.items():
                            outfile.write('{}\t\tansible_host={}\n'.format(k, v))
                    outfile.write('\n')

    return 0

(当然,这不是生产代码)

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 2019-02-13
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2020-10-14
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多