Saltar al contenido

Cómo usar el módulo de barra de progreso con urlretrieve

Revisamos de forma cada secciones en nuestro espacio con la meta de mostrarte siempre información veraz y actualizada.

Solución:

La sugerencia en la otra respuesta no progresó para mí más allá del 1%. Aquí hay una implementación completa que me funciona en Python 3:

import progressbar
import urllib.request


pbar = None


def show_progress(block_num, block_size, total_size):
    global pbar
    if pbar is None:
        pbar = progressbar.ProgressBar(maxval=total_size)
        pbar.start()

    downloaded = block_num * block_size
    if downloaded < total_size:
        pbar.update(downloaded)
    else:
        pbar.finish()
        pbar = None


urllib.request.urlretrieve(model_url, model_file, show_progress)

Creo que la mejor solución es crear una clase que tenga todo el estado necesario.

class MyProgressBar():
    def __init__(self):
        self.pbar = None

    def __call__(self, block_num, block_size, total_size):
        if not self.pbar:
            self.pbar=progressbar.ProgressBar(maxval=total_size)
            self.pbar.start()

        downloaded = block_num * block_size
        if downloaded < total_size:
            self.pbar.update(downloaded)
        else:
            self.pbar.finish()

y llama :

urllib.request.urlretrieve('img_url', 'img_filename', MyProgressBar())

El gancho se define como:

urlretrieve(url[, filename[, reporthook[, data]]])

"El tercer argumento, si está presente, es una función de enlace que se llamará una vez al establecerse la conexión de red y una vez después de cada bloque leído a partir de entonces. Al enlace se le pasarán tres argumentos: un recuento de bloques transferidos hasta el momento, un tamaño de bloque en bytes y el tamaño total del archivo. El tercer argumento puede ser -1 en servidores FTP más antiguos que no devuelven un tamaño de archivo en respuesta a una solicitud de recuperación. "

Entonces, puedes escribir un gancho de la siguiente manera:

# Global variables
pbar = None
downloaded = 0

def show_progress(count, block_size, total_size):
    if pbar is None:
        pbar = ProgressBar(maxval=total_size)

    downloaded += block_size
    pbar.update(block_size)
    if downloaded == total_size:
        pbar.finish()
        pbar = None
        downloaded = 0

Como nota al margen, le recomiendo encarecidamente que use la biblioteca de solicitudes, que es mucho más fácil de usar y puede iterar sobre la respuesta con el iter_content() método.

Acuérdate de que puedes optar por la opción de añadir una tasación acertada si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *