Сохранить / выгрузить файл YAML с комментариями в PyYAML - PullRequest
43 голосов
/ 31 августа 2011

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

# The following key opens a door
key: value

Можно ли как-то load и dump получить эти данные, сохранив комментарий?

Ответы [ 3 ]

72 голосов
/ 24 ноября 2014

Если вы используете блочную структуру YAML, вы можете использовать пакет python¹ ruamel.yaml , который является производным от PyYAML и поддерживает сохранение комментариев в обоих направлениях :

import sys
import ruamel.yaml

yaml_str = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

yaml = ruamel.yaml.YAML()  # defaults to round-trip if no parameters given
code = yaml.load(yaml_str)
code['name']['given'] = 'Bob'

yaml.dump(code, sys.stdout)

с результатом:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

Обратите внимание, что комментарии в конце строки все еще выровнены.

Вместо обычных list и dict объектов code состоит из завернутых версий², к которым прикреплены комментарии.

¹ Установить с pip install ruamel.yaml. Работает на Python 2.6 / 2.7 / 3.3 +
² ordereddict используется в случае отображения, чтобы сохранить порядок

14 голосов
/ 31 августа 2011

PyYAML выбрасывает комментарии на очень низком уровне (в Scanner.scan_to_next_token).

Хотя вы можете адаптировать или расширить его для обработки комментариев во всем его стеке, это будет серьезной модификацией. Dump ing (= испускание) комментариев кажется более простым и обсуждалось в ticket 114 на старом трекере ошибок PyYAML.

1 голос
/ 10 января 2018

У меня есть ветвь pyyaml, которая делает именно это. https://github.com/pflarr/pyyaml

Чтобы создать файл yaml с комментариями, вы должны создать поток событий, включающий события комментариев. Комментарии в настоящее время разрешены только перед элементами последовательности и клавишами сопоставления.

В настоящее время это работает только для python3, я не перенес его в версию библиотеки python2, но могу легко сделать это по запросу. Кроме того, это также должно быть довольно легко портировать на C libyaml, так как код Python в любом случае является простым портом этого.

...