requests libreria headers python python-requests

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



requests python post (3)

Necesito descargar un archivo de tamaño considerable (~ 200MB). Descubrí cómo descargar y guardar el archivo here . 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)


Parece que hay una desconexión entre los ejemplos en la página de ProgressBar 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 Issue .

import progressbar import requests url = "http://.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.


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/