【问题标题】:merge two yaml files in python在python中合并两个yaml文件
【发布时间】:2018-05-05 14:40:19
【问题描述】:

我有两个如下所述的 yaml 文件

test1.yaml

resources:
  server_group_1:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 5] }
      policies: [ { get_param: [server_group_types, 5] } ]

  server_group_2:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 8] }
      policies: [ { get_param: [server_group_types, 8] } ]
output:
  check_1:
    description: Name of the instance
    value: { get_attr: [check_1, vname] }

test2.yaml

resources:
  server_group_4:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 4] }
      policies: [ { get_param: [server_group_types, 4] } ]

  server_group_9:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 7] }
      policies: [ { get_param: [server_group_types, 7] } ]
output:
  check_6:
    description: Name of the instance
    value: { get_attr: [check_6, vname] }

我想合并这两个文件并创建一个新的输出文件,所以我使用 pyyaml 更改顺序在此 link 中发布相同

有人可以在不更改顺序的情况下帮助合并这些文件吗? 最终的yaml应该是这样的

final.yaml

resources:
  server_group_1:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 5] }
      policies: [ { get_param: [server_group_types, 5] } ]

  server_group_2:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 8] }
      policies: [ { get_param: [server_group_types, 8] } ]

  server_group_4:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 4] }
      policies: [ { get_param: [server_group_types, 4] } ]

  server_group_9:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 7] }
      policies: [ { get_param: [server_group_types, 7] } ]
output:
  check_1:
    description: Name of the instance
    value: { get_attr: [check_1, vname] }

  check_6:
    description: Name of the instance
    value: { get_attr: [check_6, vname] } 

更新

我可以使用 ruamel.yaml 合并文件...这里是更新资源的示例代码

代码:

import ruamel.yaml
yaml = ruamel.yaml.YAML()
#Load the yaml files
with open('/test1.yaml') as fp:
    data = yaml.load(fp)
with open('/test2.yaml') as fp:
    data1 = yaml.load(fp)
#Add the resources from test2.yaml to test1.yaml resources
for i in data1['resources']:
    print i,data1['resources'][i]
    data['resources'].update({i:data1['resources'][i]})
#create a new file with merged yaml
yaml.dump(data,file('/tmp/lal.yaml', 'w'))

【问题讨论】:

  • 尝试后我来到这里......我尝试使用 pyyaml 但由于嵌套它没有给出正确的输出并且顺序也在改变
  • @anthon 建议使用 ruamel.yaml 将尝试使用它
  • @mkrieger1 与 ruamel.yaml 合作......我的要求不要急于通过说不尝试来否决......

标签: python pyyaml ruamel.yaml


【解决方案1】:

下面的示例代码很适合我合并两个 yaml 文件

import ruamel.yaml
yaml = ruamel.yaml.YAML()
#Load the yaml files
with open('/test1.yaml') as fp:
    data = yaml.load(fp)
with open('/test2.yaml') as fp:
    data1 = yaml.load(fp)
#Add the resources from test2.yaml to test1.yaml resources
for i in data1['resources']:
    print i,data1['resources'][i]
    data['resources'].update({i:data1['resources'][i]})
#create a new file with merged yaml
yaml.dump(data,file('/tmp/lal.yaml', 'w'))

【讨论】:

    【解决方案2】:

    另一种解决方案是使用 HiYaPyCo (https://pypi.org/project/HiYaPyCo/),它实现了保留元素顺序的合并。

    import hiyapyco
    
    yaml1 = """resources:
      server_group_1:
        type: OS::Nova::ServerGroup
        properties:
          name: { get_param: [server_groups, 5] }
          policies: [ { get_param: [server_group_types, 5] } ]
    
      server_group_2:
        type: OS::Nova::ServerGroup
        properties:
          name: { get_param: [server_groups, 8] }
          policies: [ { get_param: [server_group_types, 8] } ]
    output:
      check_1:
        description: Name of the instance
        value: { get_attr: [check_1, vname] }"""
    
    yaml2 = """resources:
      server_group_4:
        type: OS::Nova::ServerGroup
        properties:
          name: { get_param: [server_groups, 4] }
          policies: [ { get_param: [server_group_types, 4] } ]
    
      server_group_9:
        type: OS::Nova::ServerGroup
        properties:
          name: { get_param: [server_groups, 7] }
          policies: [ { get_param: [server_group_types, 7] } ]
    output:
      check_6:
        description: Name of the instance
        value: { get_attr: [check_6, vname] }"""
    
    merged_yaml = hiyapyco.load([yaml1, yaml2], method=hiyapyco.METHOD_MERGE)
    print(hiyapyco.dump(merged_yaml))
    

    输出:

    resources:
      server_group_1:
        type: OS::Nova::ServerGroup
        properties:
          name:
            get_param: [server_groups, 5]
          policies:
          - get_param: [server_group_types, 5]
      server_group_2:
        type: OS::Nova::ServerGroup
        properties:
          name:
            get_param: [server_groups, 8]
          policies:
          - get_param: [server_group_types, 8]
      server_group_4:
        type: OS::Nova::ServerGroup
        properties:
          name:
            get_param: [server_groups, 4]
          policies:
          - get_param: [server_group_types, 4]
      server_group_9:
        type: OS::Nova::ServerGroup
        properties:
          name:
            get_param: [server_groups, 7]
          policies:
          - get_param: [server_group_types, 7]
    output:
      check_1:
        description: Name of the instance
        value:
          get_attr: [check_1, vname]
      check_6:
        description: Name of the instance
        value:
          get_attr: [check_6, vname]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-13
      • 2021-07-23
      • 2019-01-27
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      相关资源
      最近更新 更多