2011-08-31 16 views
29

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?

+1

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. –

Respuesta

11

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).

+1

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

38

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

+2

Esta debería ser la respuesta aceptada. – bram

+0

Esto no responde la pregunta de OP. Conserva el orden, pero no los comentarios. – Cerin

+2

@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

0

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.

Cuestiones relacionadas