Tengo un archivo YAML que tiene este aspecto:Guardar/volcar un archivo YAML con comentarios en PyYAML
# The following key opens a door
key: value
¿Hay alguna manera de load
y dump
estos datos mientras se mantiene el comentario?
Tengo un archivo YAML que tiene este aspecto:Guardar/volcar un archivo YAML con comentarios en PyYAML
# The following key opens a door
key: value
¿Hay alguna manera de load
y dump
estos datos mientras se mantiene el comentario?
PyYAML descarta 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
ing (= emitiendo) comentarios parece ser más fácil y se discutió en ticket 114 en el rastreador de errores PyYAML antiguo. Desafortunadamente, las entradas antiguas no se han archivado (y archive.org search está actualmente roto).
Tiene razón, fue una modificación importante, aunque más fácil porque dejé <2.6 compatibilidad y recombiné las fuentes Py2 y Py3. – Anthon
Si está utilizando estructurado en bloques YAML, puede utilizar la pitón package¹ ruamel.yaml que es un derivado de PyYAML y compatible con la preservación de ida y vuelta de los comentarios:
import sys
import ruamel.yaml
yaml_str = """\
# example
name:
# details
family: Smith # very common
given: Alice # one of the siblings
"""
code = ruamel.yaml.round_trip_load(yaml_str)
code['name']['given'] = 'Bob'
ruamel.yaml.round_trip_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 al final de la línea todavía están alineados.
En lugar de objetos list
y dict
normales, el code
consiste en versiones envueltas² a las que se adjuntan los comentarios.
¹ Instalar con pip install ruamel.yaml
. Funciona en Python 2.6/2.7/3.3 +
² ordereddict
se utiliza en caso de una asignación, para preservar el pedido
Esta debería ser la respuesta aceptada. – bram
Esto no responde la pregunta de OP. Conserva el orden, pero no los comentarios. – Cerin
@cerin ¿Qué comentarios faltan cuando ejecuta el código anterior? ¿Con qué versión de Python, ruamel.yaml y en qué plataforma ejecutó este código? Acabo de reintentar esto con la última versión de ruamel.yaml (en caso de que haya roto algo) y la salida aún incluye comentarios. Dada la cantidad de votos positivos aquí, creo que otros han podido obtener el mismo resultado, y que es posible que haya pasado por alto algo. – Anthon
He 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. Los comentarios actualmente solo están permitidos antes de los elementos de secuencia y las 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.
Una vez modifiqué el código de C libyaml para emitir comentarios para mi propio uso. Extender esto a PyYAML no va a ser fácil. –