Индикатор выполнения при загрузке файла через http с запросами

Мне нужно загрузить файл размером (~ 200 МБ). Я понял, как скачать и сохранить файл здесь. Было бы неплохо иметь индикатор прогресса, чтобы узнать, сколько было загружено. Я нашел ProgressBar, но я не уверен, как объединить их.

Вот код, который я пробовал, но он не работал.

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

Ответ 1

Я предлагаю вам попробовать tqdm [1], он очень прост в использовании. Пример кода для загрузки с помощью библиотеки requests [2]:

from tqdm import tqdm
import requests

url = "http://www.ovh.net/files/10Mb.dat" #big file test
# 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 #1 Kibibyte
t=tqdm(total=total_size, unit='iB', unit_scale=True)
with open('test.dat', 'wb') as f:
    for data in r.iter_content(block_size):
        t.update(len(data))
        f.write(data)
t.close()
if total_size != 0 and t.n != total_size:
    print("ERROR, something went wrong")

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

Ответ 2

Кажется, что существует разрыв между примерами на странице использования индикатора выполнения и тем, что на самом деле требует код.

В следующем примере обратите внимание на использование maxval вместо max_value. Также обратите внимание на использование .start() для инициализации панели. Это было отмечено в выпуске.

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)

Ответ 3

Кажется, вам нужно получить размер удаленного файла (здесь), чтобы рассчитать, насколько далеко вы находитесь.

Затем вы можете обновить индикатор выполнения при обработке каждого фрагмента... если вы знаете общий размер и размер фрагмента, вы можете выяснить, когда обновлять индикатор выполнения.