使用Python从YAML文件转储数据

2024-10-02 00:36:51 发布

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

我有一个如下的YAML文件:

- workload:
    name: cloud1
    param:
      p1: v1
      p2: v2

- workload:
    name: cloud2
    param:
      p1: v1
      p2: v2

我可以使用以下Python脚本解析该文件:

^{pr2}$

输出:

name cloud1
param {'p1': 'v1'}

但我要找的是:

workload1 = cloud1
workload1_param_p1 = v1
workload1_param_p2 = v2

workload2 = cloud2
workload2_param_p1 = v1
workload2_param_p2 = v2

Tags: 文件name脚本yamlparamv2v1p2
1条回答
网友
1楼 · 发布于 2024-10-02 00:36:51

输出与输入不匹配,因为YAML文件的顶层是一个映射到Pythonlist的序列。
另一件不完全清楚的事情是workload,尤其是workload1中的1来自何处。在下面,我假设它们来自构成序列元素的映射键。序列元素的位置(从1开始,因此idx+1)。 从值的副本中弹出name,以便可以递归地正确转储其余值:

import sys
import ruamel.yaml

yaml_str = """\
- workload:
    name: cloud1
    param:
      p1: v1
      p2: v2

- workload:
    name: cloud2
    param:
      p1: v1
      p2: v2
"""

data = ruamel.yaml.round_trip_load(yaml_str)

def dump(prefix, d, out):
    if isinstance(d, dict):
        for k in d:
            dump(prefix[:] + [k], d[k], out)
    else:
        print('_'.join(prefix), '=', d, file=out)

for idx, workload in enumerate(data):
    for workload_key in workload:
        values = workload[workload_key].copy()
        # alternatively extract from values['name']
        workload_name = '{}{}'.format(workload_key, idx+1)
        print(workload_name, '=', values.pop('name'))
        dump([workload_name], values, sys.stdout)
    print()

给出:

^{pr2}$

这是使用ruamel.yaml,一个yaml1.2解析器完成的,我是其作者。如果您只有yaml1.1代码(PyYAML支持),您仍然应该使用ruamel.yaml,因为它的往返加载器保证您的{}是在{}之前打印的(PyYAML不能保证)。在

相关问题 更多 >

    热门问题