Как добавить файл YAML с помощью Python? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть YAML-файл с именем data.yaml:

---
'001':
  name: Ben
  email: ben@test.com

Я хотел бы иметь обновленный файл, который выглядит следующим образом:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223

Как мне добиться этого вPython с использованием пакета yaml / s?

Редактировать:

Я пытался:

import yaml
import io

data = {'002': {'name': 'Lisa', 'email': 'lisa@test.com', 'numbers': ['000-111-2222', '000-111-2223']}}

with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.safe_dump(data, outfile, default_flow_style=False, allow_unicode=True)

Метод safe_dump переопределяет содержимое файла, и я вижу толькоэто как новое содержимое файла!

'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223

1 Ответ

0 голосов
/ 11 февраля 2019

Как правило, вы не можете добавить документ YAML в файл, просто написав дополнительную информацию в конце этого файла.Эта миграция работает для документов YAML, которые имеют отображение или последовательность на верхнем уровне, который является стилем блока, но даже тогда простое добавление может работать только для определенных случаев документов.

Просто загрузить YAML вСтруктура данных Python, обновите / расширите эту структуру и затем сбросьте ее обратно.Таким образом, вам не придется иметь дело с потенциальными дублирующимися ключами, непечатными документами и другими проблемами, которые приведут к неверному YAML при использовании простого добавления.Если исходный файл называется input.yaml, то сработает следующее:

import sys
from pathlib import Path
import ruamel.yaml

file_name = Path('input.yaml')

record_to_add = dict(name='Lisa', email='lisa@test.com', numbers=['000-111-2222', '000-111-2223'])

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(file_name)
data['002'] = record_to_add
yaml.dump(data, sys.stdout)

, что дает:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers:
  - 000-111-2222
  - 000-111-2223
...