Сохранить / дамп файла YAML с комментариями в PyYAML
у меня есть файл yaml, который выглядит так:
# The following key opens a door
key: value
есть ли способ я могу load
и dump
эти данные при сохранении комментария?
3 ответов
PyYAML отбрасывает комментарии на очень низком уровне (в Scanner.scan_to_next_token
).
хотя вы можете адаптировать или расширить его для обработки комментариев во всем стеке, это будет серьезная модификация. Dump
ING (=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 является простым портом этого в любом случае.