es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Archivo YAML no carga con valores anidados.

Estoy escribiendo un analizador YAML en python usando ruamel.yaml.
La razón por la que uso ruamel.yaml es porque mantiene los comentarios, ¡lo cual es clave!

Sé que el problema se produce con el archivo YAML y no estoy seguro de cómo solucionar este problema o cuál podría ser una modificación potencial. He probado algunas variaciones de la indentación, pero no he tenido éxito.

Manteniéndolo simple, pasando la fuente e intentando cargarla.

Código:

import os
import os.path
import ruamel.yaml
from ruamel.yaml import YAML

def main():
    source = "my_yaml.yml"
    # Comprobar si el archivo fuente es válido YAML
    try:
        yaml = ruamel.yaml.YAML()
        with open(source) as fp:
            # data es el contenido del archivo y se utilizará más adelante
            data = yaml.load(fp)

        if data is None:
            data = {}
        return data
    except:
        print("El archivo YAML no es válido. Por favor, compruebe la fuente.")
        return 1

if __name__ == "__main__":
    out = main()

YAML que funciona:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"

YAML que no funciona:

d1: "key1"
d2: "key2"
d3: 
  d3_nest1: "key3"
  d3_nest2: "key4"
  # este siguiente elemento rompe mi YAML
  - d3_nest3: "key6"
  d3_nest4: "key7"

Otras variaciones de YAML:

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# este siguiente elemento rompe mi YAML
- d3_nest3: "key6"
    d3_nest4: "key7"

d1: "key1"
d2: "key2"
d3: 
    d3_nest1: "key4"
    d3_nest2: "key5"
# este siguiente elemento rompe mi YAML
    - d3_nest3: "key6"
        d3_nest4: "key7"
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el archivo YAML que no funciona es que hay un elemento de lista (-) dentro de un diccionario (d3). YAML no permite mezclar tipos de datos en un solo bloque. Para solucionar este problema, el elemento de lista debería ser su propio diccionario o no debería estar incluido en el diccionario d3. Aquí tienes un ejemplo de cómo modificar el YAML para que funcione:

    YAML modificado:

    d1: "clave1"
    d2: "clave2"
    d3: 
      d3_nest1: "clave3"
      d3_nest2: "clave4"
    d3_nest3: "clave6"
    d3_nest4: "clave7"
    

    Esta modificación mueve los pares clave-valor d3_nest3 y d3_nest4 fuera del diccionario d3 y los convierte en sus propias claves en el diccionario padre.

Comments are closed.