web-dev-qa-db-fra.com

Barre de progression pendant le téléchargement du fichier via http avec les demandes

J'ai besoin de télécharger un fichier volumineux (~ 200 Mo). J'ai compris comment télécharger et enregistrer le fichier avec ici . Ce serait bien d'avoir une barre de progression pour savoir combien a été téléchargé. J'ai trouvé ProgressBar mais je ne sais pas comment incorporer les deux ensemble.

Voici le code que j'ai essayé, mais cela n'a pas fonctionné.

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

Je vous suggère d'essayer tqdm [1], c'est très facile à utiliser. Exemple de code à télécharger avec la bibliothèque 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/

54
leovp

Il semble qu'il y ait un décalage entre les exemples de la page tilisation de la barre de progression et ce dont le code a réellement besoin.

Dans l'exemple suivant, notez l'utilisation de maxval au lieu de max_value. Notez également l'utilisation de .start() pour initialiser la barre. Cela a été noté dans 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)
4
andrew

Il semble que vous aurez besoin d'obtenir la taille du fichier distant ( répondu ici ) pour calculer votre chemin.

Vous pouvez ensuite mettre à jour votre barre de progression pendant le traitement de chaque bloc ... si vous connaissez la taille totale et la taille du bloc, vous pouvez déterminer quand mettre à jour la barre de progression.

2
Paul Ellsworth