Индикатор выполнения при загрузке файла через 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
Кажется, вам нужно получить размер удаленного файла (здесь), чтобы рассчитать, насколько далеко вы находитесь.
Затем вы можете обновить индикатор выполнения при обработке каждого фрагмента... если вы знаете общий размер и размер фрагмента, вы можете выяснить, когда обновлять индикатор выполнения.