¿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!
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 usartqdm
: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:
tqdm
usandofrom tqdm import tqdm
.res = requests.get(url_to_file)
.open("./downloads/%s" % (file_name), "wb")
, y lo envolvemos con una barra de progresotqdm
usandotqdm.wrapattr
. El argumentominiters = 1
obliga a mostrar al menos una iteración para descargas más lentas. El argumentodesc = "Descargando archivo"
establece el mensaje que se mostrará junto a la barra de progreso. El argumentototal = 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).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 usandof.write(chunk)
.print("¡Listo!")
.