繁体   English   中英

使用Python从YAML文件中转储数据

[英]Dumping data from YAML file using Python

我有一个YAML文件,如下所示:

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

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

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

#!/usr/bin/env python

import yaml   

try:
 for key, value in yaml.load(open('workload.yaml'))['workload'].iteritems():
   print key, value
except yaml.YAMLError as out:
  print(out)

输出:

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

您的输出与您的输入不匹配,因为YAML文件的顶层是映射到Python list的序列。
另一个不完全清楚的是workload ,尤其是workload1 1中的workload1来自何处。 在下文中,我假设它们来自构成序列元素resp的映射键。 该序列元素的位置(从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()

给出:

workload1 = cloud1
workload1_param_p1 = v1
workload1_param_p2 = v2

workload2 = cloud2
workload2_param_p1 = v1
workload2_param_p2 = v2

这是使用ruamel.yaml (YAML 1.2解析器)完成的,我是作者。 如果你只有YAML 1.1码(由PyYAML所支持的),你还是应该使用ruamel.yaml作为其round_trip_loader保证你workload_param_p1之前印刷workload_param_p2 (与PyYAML不被保证)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM