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.

Tengo dificultades para agregar y eliminar líneas en blanco con ruamel roundtrip.

Tengo un archivo YAML grande en el que necesito agregar 2 pares clave-valor al final de un elemento. Aquí tienes un ejemplo del formato del archivo original:

(repo1 es el nombre del repositorio)

repo1:
  description: descripción de ejemplo
  team: equipo de ejemplo

repo2:
  description: descripción de ejemplo
  team: equipo de ejemplo

Quiero que el resultado se vea así:

repo1:
  description: descripción de ejemplo
  team: equipo de ejemplo
  archived: true
  archived_date: fecha de ejemplo

repo2:
  description: descripción de ejemplo
  team: equipo de ejemplo

Estoy utilizando “ruamel.yaml” para mantener el formato y los comentarios en la parte superior de este archivo grande. Mi código para hacer esto es el siguiente, toma un parámetro “repo_name” que es el elemento al que quiero agregarle:

from ruamel.yaml import YAML
from datetime import datetime

yaml = YAML()
with open("repos.yml", "r") as file:
  repos = yaml.load(file)
for repo in repos.items():
  if repo_name == repo[0]:
    repo[1].update({"archived": bool("true"), "archived_date": datetime.today().strftime('%d-%m-%Y')})
    break
  else:
    continue

with open("repos.yml", "w") as processed_file:
  yaml.default_flow_style = False
  yaml.width = float("inf")
  yaml.dump(repos, processed_file)

Esto casi hace lo que quiero, pero la salida se ve así:

repo1:
  description: descripción de ejemplo
  team: equipo de ejemplo

  archived: true
  archived_date: fecha de ejemplo
repo2:
  description: descripción de ejemplo
  team: equipo de ejemplo

¿Cómo puedo eliminar la línea en blanco antes de lo que he agregado y agregar una después de él? Al imprimir “repo[1]” en el bucle, se muestra que el diccionario no tiene una línea en blanco, pero quiero usar “roundtrip” para mantener el resto del formato.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar la línea en blanco antes de los nuevos pares clave-valor y agregar una nueva línea después de ellos, puedes pasar el argumento default_style=False al método dump() del objeto YAML. Aquí está el código modificado:

    from ruamel.yaml import YAML
    from datetime import datetime
    
    yaml = YAML()
    with open("repos.yml", "r") as file:
        repos = yaml.load(file)
    
    nombre_repo = "repo1"  # reemplaza con el nombre del repositorio deseado
    
    for repo in repos.items():
        if nombre_repo == repo[0]:
            repo[1].update({"archived": bool("true"), "archived_date": datetime.today().strftime('%d-%m-%Y')})
            break
    
    with open("repos.yml", "w") as processed_file:
        yaml.default_flow_style = False
        yaml.width = float("inf")
        # agregar la siguiente línea para eliminar la línea en blanco antes de los nuevos pares clave-valor
        yaml.dump(repos, processed_file, default_style=False)
        # agregar una nueva línea después de los nuevos pares clave-valor
        processed_file.write("\n")
    

    Con el argumento default_style=False, el resultado del roundtrip mostrará los nuevos pares clave-valor en estilo bloque, lo cual no añade una línea en blanco antes del diccionario. La línea processed_file.write("\n") agrega una nueva línea después del diccionario para que coincida con el formato del archivo original.

Comments are closed.