python yaml pyyaml

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.