2016-06-01 13 views
12

Ho bisogno di scaricare un file di dimensioni considerevoli (~ 200 MB). Ho capito come scaricare e salvare il file con here. Sarebbe bello avere una barra di avanzamento per sapere quanto è stato scaricato. Ho trovato ProgressBar ma non sono sicuro di come integrare i due insieme.mentre si scarica il file su http con Richieste

Ecco il codice che ho provato, ma non ha funzionato.

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

Qual è l'errore di traceback che si sta ottenendo? – andrew

+0

Nessuno, semplicemente non si aggiorna. – Gamegoofs2

+0

Interessante. Potremmo usare versioni diverse. Ricevo un "argomento di parole chiave inatteso 'max_value'" quando copio/incolli la prima linea. Sto usando la versione 2.3. – andrew

risposta

25

Vi suggerisco di provare tqdm [1], è molto facile da usare. codice di esempio per il download con requests libreria [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/

+0

Non sono sicuro che manchi qualcosa, ma non mostra una barra di avanzamento per me, solo le cifre (penso perché tqdm non conosce la dimensione totale?) – Juicy

+0

Sì, è necessario ottenere la lunghezza totale e passalo come parametro: 'total = int (r.headers.get ('content-length')); ... tqdm (r.iter_content(), total = total) ... ' – Juicy

+0

Grazie! E aggiungi 'unit = 'B', unit_scale = True' alla chiamata' tqdm() 'per statistiche leggibili dall'uomo ... – Willem

2

Sembra che si sta andando ad avere bisogno di ottenere la dimensione file remoto (answered here) per calcolare quanto sei lontano.

È quindi possibile aggiornare la barra di avanzamento durante l'elaborazione di ogni blocco ... se si conosce la dimensione totale e la dimensione del blocco, è possibile capire quando aggiornare la barra di avanzamento.

3

Sembra che ci sia una disconnessione tra gli esempi sulla pagina Progress Bar Usage e cosa il codice effettivamente richiede.

Nell'esempio seguente, non l'uso di maxval anziché max_value. Si noti inoltre l'uso di .start() per inizializzare la barra. Questo è stato notato in un Issue.

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)