Barra de progreso mientras se descarga el archivo a través de http con solicitudes

Necesito descargar un archivo de tamaño considerable (~ 200MB). Descubrí cómo descargar y guardar el archivo aquí . Sería bueno tener una barra de progreso para saber cuánto se ha descargado. Encontré ProgressBar pero no estoy seguro de cómo incorporar a los dos juntos.

Aquí está el código que intenté, pero no funcionó.

bar = progressbar.ProgressBar(max_value=progressbar.UnknownLength) with closing(download_file()) as r: for i in range(20): bar.update(i) 

Te sugiero que pruebes tqdm [1], es muy fácil de usar. Código de ejemplo para descargar con la biblioteca de requests [2]:

 from tqdm import tqdm import requests import math url = "http://example.com/bigfile.bin" # Streaming, so we can iterate over the response. r = requests.get(url, stream=True) # Total size in bytes. total_size = int(r.headers.get('content-length', 0)); block_size = 1024 wrote = 0 with open('output.bin', 'wb') as f: for data in tqdm(r.iter_content(block_size), total=math.ceil(total_size//block_size) , unit='KB', unit_scale=True): wrote = wrote + len(data) f.write(data) if total_size != 0 and wrote != total_size: print("ERROR, something went wrong") 

[1]: https://github.com/tqdm/tqdm
[2]: http://docs.python-requests.org/en/master/

Parece que hay una desconexión entre los ejemplos en la página de Uso de la barra de progreso y lo que realmente requiere el código.

En el siguiente ejemplo, observe el uso de maxval lugar de max_value . También tenga en cuenta el uso de .start() para inicializar la barra. Esto se ha observado en un problema .

 import progressbar import requests url = "http://stackoverflow.com/" def download_file(url): local_filename = 'test.html' r = requests.get(url, stream=True) f = open(local_filename, 'wb') file_size = int(r.headers['Content-Length']) chunk = 1 num_bars = file_size / chunk bar = progressbar.ProgressBar(maxval=num_bars).start() i = 0 for chunk in r.iter_content(): f.write(chunk) bar.update(i) i+=1 f.close() return download_file(url) 

Parece que va a necesitar obtener el tamaño del archivo remoto (que se responde aquí ) para calcular qué tan lejos está.

Luego puede actualizar su barra de progreso mientras procesa cada fragmento … si conoce el tamaño total y el tamaño del fragmento, puede averiguar cuándo actualizar la barra de progreso.