Подтвердить что ты не робот

Индикатор выполнения Python и загрузки

У меня есть python script, который запускает URL-адрес, который является загружаемым файлом. Есть ли способ заставить командную строку использовать python для отображения прогресса загрузки, поскольку он противостоит запуску браузера?

4b9b3361

Ответ 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 не был предложен! enter image description here

Ответ 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)