Сохранить блок из файла 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, автором которого я являюсь.