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"
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:
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.