объединить два файла yaml в python

У меня есть два файла 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, порядок изменения публикуется так же, как и в этом ссылка

Может ли кто-нибудь помочь объединить эти файлы, не меняя порядок? Окончательный yaml должен быть таким

окончательный.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'))

person Naresh    schedule 22.11.2017    source источник
comment
После попытки я пришел сюда... Я пробовал с pyyaml, но из-за вложенности он не дает правильного вывода, и порядок также меняется   -  person Naresh    schedule 22.11.2017
comment
@anthon предложил использовать ruamel.yaml, попробуем использовать его   -  person Naresh    schedule 22.11.2017
comment
@mkrieger1 работал с ruamel.yaml ... Моя просьба не спешите минусовать, говоря, что не пытаюсь .....   -  person Naresh    schedule 22.11.2017


Ответы (2)


Ниже пример кода хорошо работал для меня, чтобы объединить два файла 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'))
person Naresh    schedule 22.11.2017

Альтернативным решением является использование 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]
person augur    schedule 15.08.2018