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/