Сохранить блок из файла YAML и добавить его в существующий файл YAML, используя Python

У меня есть большая часть кода, где я читаю каждый файл и дампа в новый файл. Мой следующий шаг - сохранить car1 (от мамы, file2) и добавить его в блок папы как car2, file1).

------
File 1
------
dad:
  car1:
    model: [toyota-venza]
    awd: true
    option:
      nav:
        backup_camera: true
        version: 1.35 
    mileage: 54,025
    year: 2000
age:
  ...

------
File 2
------
mom:
  car1:
    model: [toyota-camry]
    awd: false
    option:
      nav:
        backup_camera: false
        version: []
    mileage: 20,241
    year: 2013
age:
  ...

Где новый файл будет выглядеть следующим образом... содержащий car1 и car2 для папы.

dad:
  car1:
    model: [toyota-venza]
    awd: true
    option:
      nav:
        backup_camera: true
          version: 1.35 
    mileage: 54,025
    year: 2000
  car2:
    model: [toyota-camry]
    awd: false
    option:
      nav:
        backup_camera: false
          version: []
    mileage: 20,241
    year: 2013

1 ответ

Предполагая, что вы любезно найдете информацию об автомобиле с помощью ключа 'car1', вы можете найти в сопоставлении верхнего уровня значение с этим ключом:

import ruamel.yaml as yaml
from ruamel.yaml.comments import CommentedMap
import glob

dad = CommentedMap()
dad['dad'] = d = CommentedMap()

for idx, file_name in enumerate(sorted(glob.glob('car*.yaml'))):
    data = yaml.load(open(file_name), Loader=yaml.RoundTripLoader)
    for k in data:
        if 'car1' in data[k]:
            new_key = 'car{0}'.format(idx+1)
            d[new_key] = data[k]['car1']
            d.yaml_add_eol_comment('# from {0} in {1}'.format(k, file_name),
                                   key=new_key, column=30)

print(yaml.dump(dad, Dumper=yaml.RoundTripDumper))

дает тебе:

dad:
  car1:                       # from dad in car1.yaml
    model: [toyota-venza]
    awd: true
    option:
      nav:
        backup_camera: true
        version: 1.35
    mileage: 54,025
    year: 2000
  car2:                       # from mom in car2.yaml
    model: [toyota-camry]
    awd: false
    option:
      nav:
        backup_camera: false
        version: []
    mileage: 20,241
    year: 2013

Предполагая данные в файлах car1.yaml а также car2.yaml, Я использовал ruamel.yaml¹ здесь, чтобы использовать упорядоченные карты, к которым вы прикрепляете комментарии.

Вы можете сделать это с PyYAML, но вы потеряете гарантированный заказ и комментарии:

import yaml
import glob

dad = dict()
dad['dad'] = d = dict()

for idx, file_name in enumerate(sorted(glob.glob('car*.yaml'))):
    data = yaml.load(open(file_name), Loader=yaml.SafeLoader)
    for k in data:
        if 'car1' in data[k]:
            new_key = 'car{0}'.format(idx+1)
            d[new_key] = data[k]['car1']

print(yaml.dump(dad, Dumper=yaml.SafeDumper))

¹ Это было сделано с помощью ruamel.yaml, автором которого я являюсь.

Другие вопросы по тегам