2012-02-03 34 views
8

Ejemplo de Using YAML with Python¿Cómo puedo crear un archivo yaml de python puro?

archivo YAML original contiene este

# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 

Después de cargar el contenido del archivo usando yaml.load(), y lo descarga en un nuevo archivo YAML, consigo este lugar:

# tree format 
treeroot: 
    branch1: 
     branch1-1: {name:Node 1-1} 
     name: Node 1 
    branch2: 
     branch2-1: {name: Node 2-1} 
     name: Node 2 

¿Cuál es la forma correcta de compilar un archivo YAML directamente desde python puro? No quiero escribir una cuerda yo mismo. Quiero construir el diccionario y la lista.


parcial ...

dataMap = {'treeroot': 
       {'branch2': 
       {'branch1-1': 
        {'name': 'Node 1-1'}, # should be its own level 
        'name': 'Node 1' 
       } 
       } 
      } 
+1

¿Está preguntando cómo puede garantizar la obtención del mismo archivo como en? Si es así, no hay garantía, porque los diccionarios no tienen un orden predefinido. – Nate

+0

@Nate Correcto, esa es mi intención. Entiendo que. Edité y proporcioné parte de la estructura. Los volcados de Yaml no pueden parasejar el {nombre interno: Nodo 1-1} interior en otro nivel ... – CppLearner

Respuesta

7

bien. Solo revisé la documentación dos veces. Necesitamos esto al final de la yaml.dump(data, optional_args)

La solución es esta

yaml.dump(dataMap, f, default_flow_style=False) 

donde Datamap es la fuente yaml.load() y f es el archivo que desea escribir.

+0

Este volcado no escribe el comentario '#tree format'. – Anthon

1

Suponiendo que está usando PyYAML como probablemente es, la salida es mostrar no copiar y pegar de lo que un yaml.dump() generado, ya que incluye un comentario, y no lo hace PyYAML escribe ésos.

Si desea conservar ese comentario, así como por ejemplo el ordenamiento clave en el archivo (agradable cuando vaya a guardar el archivo en un sistema de control de versiones) utiliza ¹:

import ruamel.yaml as yaml 

yaml_str = """\ 
# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 # should be its own level 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 
""" 

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) 
print yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4) 

que te lleva exactamente la entrada:

# tree format 
treeroot: 
    branch1: 
     name: Node 1 
     branch1-1: 
      name: Node 1-1 # should be its own level 
    branch2: 
     name: Node 2 
     branch2-1: 
      name: Node 2-1 

¹ Esto se hizo utilizando ruamel.yaml una versión mejorada de PyYAML de los cuales yo soy el autor.

Cuestiones relacionadas