У меня есть python script, который запускает URL-адрес, который является загружаемым файлом. Есть ли способ заставить командную строку использовать python для отображения прогресса загрузки, поскольку он противостоит запуску браузера?
Индикатор выполнения Python и загрузки
Ответ 1
Обновлено для вашего образца URL:
Я только что написал очень простой (немного хакерский) подход к этому для удаления PDF файлов с определенного сайта. Обратите внимание, что он корректно работает только в системах на основе Unix (Linux, Mac OS), так как powershell не обрабатывает "\ r"
import requests
link = "http://indy/abcde1245"
file_name = "download.data"
with open(file_name, "wb") as f:
print "Downloading %s" % file_name
response = requests.get(link, stream=True)
total_length = response.headers.get('content-length')
if total_length is None: # no content length header
f.write(response.content)
else:
dl = 0
total_length = int(total_length)
for data in response.iter_content(chunk_size=4096):
dl += len(data)
f.write(data)
done = int(50 * dl / total_length)
sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) )
sys.stdout.flush()
Он использует библиотеку запросов, поэтому вам нужно установить ее. Это выводит что-то вроде следующего в вашу консоль:
> Скачивание download.data
> [=============]
Ширина индикатора в скрипте составляет 52 символа (2 символа - это просто []
поэтому 50 символов прогресса). Каждый =
представляет 2% загрузки.
Ответ 2
Вы можете использовать пакет clint '(написанный тем же автором, что и "запросы" ), чтобы добавить простую панель выполнения к вашим загрузкам следующим образом:
from clint.textui import progress
r = requests.get(url, stream=True)
path = '/some/path/for/file.txt'
with open(path, 'wb') as f:
total_length = int(r.headers.get('content-length'))
for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1):
if chunk:
f.write(chunk)
f.flush()
который даст вам динамический вывод, который будет выглядеть следующим образом:
[################################] 5210/5210 - 00:00:01
Он должен работать и на нескольких платформах! Вы можете также изменить к точкам или счетчику с .dots и .mill вместо .bar.
Наслаждайтесь!
Ответ 3
Я удивлен, что tqdm не был предложен!
Ответ 4
Я думаю, вы также можете использовать click, и у него также есть хорошая библиотека для индикатора выполнения.
import click
with click.progressbar(length=total_size, label='Downloading files') as bar:
for file in files:
download(file)
bar.update(file.size)
Наслаждайтесь!
Ответ 5
Вы можете загружать загружаемые файлы, как здесь, → Поток загрузки.
Также вы можете Stream Uploads.
Самый важный потоковый запрос выполняется, если вы не попытаетесь получить доступ к response.content всего 2 строки
for line in r.iter_lines():
if line:
print(line)
Ответ 6
Python 3 с TQDM
Это метод, предложенный в документах TQDM.
import urllib.request
from tqdm import tqdm
class DownloadProgressBar(tqdm):
def update_to(self, b=1, bsize=1, tsize=None):
if tsize is not None:
self.total = tsize
self.update(b * bsize - self.n)
def download_url(url, output_path):
with DownloadProgressBar(unit='B', unit_scale=True,
miniters=1, desc=url.split('/')[-1]) as t:
urllib.request.urlretrieve(url, filename=output_path, reporthook=t.update_to)