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.

Buscando y escribiendo en un archivo YAML con Python

Tengo un archivo YAML con varios documentos en un solo archivo.

type: ABC
api_version: v3
metadata:
  created_by: xxx
  name: cccc
namespace: zzz
spec:
  check_hooks: none
  command: bbbbb
---
type: ABC
api_version: v3
metadata:
  labels:
    aaaa.io: xxx
  created_by: me
  name: xxx
namespace: aaaa
spec:
  check_hooks: null
  command: qqqq
  1. Quiero leer el archivo
  2. Luego quiero agregar una pareja clave-valor más debajo del objeto “labels”
  3. Si el objeto de etiquetas no está debajo de los metadatos, quiero agregar “labels” y luego añadir debajo la pareja clave-valor

Tengo este código para cargar el archivo de múltiples documentos

with open(filepath) as stream:
    for data in yaml.safe_load_all(stream):
        print(data)

Puedo leer el archivo e imprimir el objeto dict en la consola. No estoy seguro de qué hacer a continuación. Estoy usando la biblioteca ruamel.yaml.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar un par clave-valor bajo el objeto “labels”, puedes utilizar el siguiente código:

    import ruamel.yaml
    
    with open(filepath) as stream:
        yaml = ruamel.yaml.YAML(typ='safe')
        yaml.allow_duplicate_keys = True
        docs = list(yaml.load_all(stream))
    
    for doc in docs:
        if 'metadata' in doc and 'labels' in doc['metadata']:
            doc['metadata']['labels']['new_key'] = 'new_value'
        elif 'metadata' in doc:
            doc['metadata']['labels'] = {'new_key': 'new_value'}
    
        # Haz algo con el documento modificado
    

    Aquí, utilizamos la biblioteca ruamel.yaml para cargar el archivo YAML con múltiples documentos. Establecemos allow_duplicate_keys en True porque el segundo documento en el archivo tiene claves duplicadas.
    Iteramos sobre cada documento en la lista docs y verificamos si el objeto “metadata” contiene un objeto “labels”. Si es así, agregamos un nuevo par clave-valor bajo el objeto “labels”. Si no es así, agregamos un nuevo objeto “labels” con el par clave-valor nuevo.
    Finalmente, puedes hacer algo con el/los documento(s) modificado(s) según tus necesidades.

Comments are closed.