python - Guardar/volcar un archivo YAML con comentarios en PyYAML
no module named yaml (3)
Tengo un archivo yaml que se ve así:
# The following key opens a door
key: value
¿Hay alguna forma en que pueda load
y dump
estos datos mientras mantengo el comentario?
PyYAML descarta los comentarios a un nivel muy bajo (en Scanner.scan_to_next_token
).
Si bien podría adaptarlo o ampliarlo para manejar los comentarios en toda su pila, esta sería una modificación importante. Dump
comentarios de Dump
(= emisión) parecen ser más fáciles y se discutieron en el ticket 114 en el rastreador de errores PyYAML anterior.
Si está utilizando YAML estructurado en bloque, puede usar el paquete ruamel.yaml que es un derivado de PyYAML y admite la preservación de comentarios de ida y vuelta :
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)
con resultado
# example
name:
# details
family: Smith # very common
given: Bob # one of the siblings
Tenga en cuenta que los comentarios de fin de línea aún están alineados.
En lugar de objetos normales de list
y dict
, el code
consiste en versiones envueltas² en las que se adjuntan los comentarios.
¹ Instalar con pip install ruamel.yaml
. Funciona en Python 2.6 / 2.7 / 3.3 +
² El ordereddict
se usa en el caso de un mapeo, para preservar el orden
Tengo una rama de pyyaml que hace exactamente esto. https://github.com/pflarr/pyyaml
Para crear un archivo yaml con comentarios, debe crear una secuencia de eventos que incluya eventos de comentarios. Actualmente solo se permiten comentarios antes de elementos de secuencia y claves de mapeo.
Esto solo funciona actualmente para python3, no lo he portado a la versión python2 de la biblioteca, pero podría hacerlo fácilmente a pedido. Además, esto también debería ser bastante fácil de portar al C libyaml, ya que el código python es un puerto simple de todos modos.