Сохранить / дамп файла YAML с комментариями в PyYAML

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

# The following key opens a door
key: value

есть ли способ я могу load и dump эти данные при сохранении комментария?

3 ответов


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

хотя вы можете адаптировать или расширить его для обработки комментариев во всем стеке, это будет серьезная модификация. DumpING (=emitting) комментарии, кажется, проще и обсуждался в билет 114 на старом pyyaml баг трекер.


если вы используете блочный структурированный YAML, вы можете использовать пакет python package1 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 состоит из обернутой versions2 на котором комментарии.

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


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

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

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