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.

¿Cómo imprimir “puntos” (u otro tipo de retroalimentación) mientras se escribe un archivo en Python?

Estoy intentando imprimir una retroalimentación visible para el usuario en la terminal mientras mi aplicación descarga un archivo de la web y lo escribe en el disco duro, pero no pude encontrar cómo hacerlo leyendo la documentación o buscando en Google.

Este es mi código:
python
res = requests.get(url_to_file)
with open(“./downloads/%s” % (file_name), ‘wb’) as f:
f.write(res.content)

Esperaba descubrir cómo hacer algo como esto:

Descargando archivo ……..

sigue funcionando hasta que la descarga esté terminada y el archivo escrito

¡Hecho!

Realmente estoy luchando incluso para empezar, porque ninguno de los métodos retorna una “promesa” (como en JS).

¡Cualquier ayuda sería muy apreciada!
¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de imprimir retroalimentación visual para el usuario mientras se descarga un archivo es usar el paquete tqdm. tqdm significa “progreso” en árabe, y te permite agregar barras de progreso, indicadores de porcentaje y otra retroalimentación visual a tus loops y procesos. Aquí te mostramos cómo puedes modificar tu código para usar tqdm:

    from tqdm import tqdm   # importa el paquete tqdm
    
    res = requests.get(url_to_file)
    
    # usa el paquete tqdm para imprimir una barra de progreso mientras se descarga el archivo
    with tqdm.wrapattr(open("./downloads/%s" % (file_name), "wb"), "write", miniters=1,
                       desc="Descargando archivo", total=int(res.headers.get("content-length", 0))) as f:
        for chunk in res.iter_content(chunk_size=8192):
            if chunk:
                f.write(chunk)
    
    print("¡Listo!")
    

    Este código imprimirá una barra de progreso mientras se descarga el archivo, con un mensaje “Descargando archivo” y una estimación del tiempo restante. Una vez que se complete la descarga, imprimirá “¡Listo!” en la consola.

    Explicación:

    • Primero importamos el paquete tqdm usando from tqdm import tqdm.
    • Luego hacemos una solicitud a la URL del archivo usando res = requests.get(url_to_file).
    • Abrimos un archivo en modo escritura binaria usando open("./downloads/%s" % (file_name), "wb"), y lo envolvemos con una barra de progreso tqdm usando tqdm.wrapattr. El argumento miniters = 1 obliga a mostrar al menos una iteración para descargas más lentas. El argumento desc = "Descargando archivo" establece el mensaje que se mostrará junto a la barra de progreso. El argumento total = int(res.headers.get("content-length", 0)) establece el número total de bytes que se descargarán, que se obtiene de las cabeceras HTTP (o se establece en 0 si no está presente).
    • Iteramos sobre el contenido de la respuesta utilizando for chunk in res.iter_content(chunk_size=8192):. chunk_size = 8192 indica el número de bytes que se leerán a la vez del flujo de respuesta. Verificamos si el fragmento no está vacío (if chunk:), y lo escribimos en el archivo usando f.write(chunk).
    • Una vez que se completa el bucle, la barra de progreso desaparece y “¡Listo!” se imprime en la consola usando print("¡Listo!").

Comments are closed.