У меня есть файл yaml, который выглядит так:
# The following key opens a door
key: value
Есть ли способ load
и dump
эти данные, сохраняя при этом комментарий?
У меня есть файл yaml, который выглядит так:
# The following key opens a door
key: value
Есть ли способ load
и dump
эти данные, сохраняя при этом комментарий?
PyYAML отбрасывает комментарии на очень низком уровне (в Scanner.scan_to_next_token
).
Хотя вы можете адаптировать или расширить его для обработки комментариев во всем стеке, это будет серьезная модификация. Dump
ing (= создание) комментариев кажется проще, и это обсуждалось в билет 114 на старом трекере ошибок PyYAML.
По состоянию на 2020 год запрос функции о добавлении поддержки загрузки комментариев все еще откладывается.
Если вы используете 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
используется в случае сопоставления для сохранения порядка
yaml.indent(mapping=2, sequence=4, offset=2)
перед выполнением dump
- person The Godfather; 01.04.2020
У меня есть ветка pyyaml, которая делает именно это. https://github.com/pflarr/pyyaml
Чтобы создать файл yaml с комментариями, вы должны создать поток событий, который включает события комментариев. Комментарии в настоящее время разрешены только перед элементами последовательности и ключами сопоставления.
В настоящее время это работает только для python3, я не портировал его в версию библиотеки для python2, но могу легко сделать это по запросу. Кроме того, это также должно быть довольно легко перенести на C libyaml, так как код python в любом случае является простым портом для этого.