2013-03-26 2 views
27

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

+4

Если мой ответ решил вашу проблему, отметьте его как принятый (щелкните небольшую контурную марку). – Endophage

ответ

51

Обновлено для образца URL:

Я только что написал супер простой (немного Hacky) подход к этому для соскабливания PDFs от определенного сайта. Обратите внимание, это работает корректно только в системах на основе UNIX (Linux, Mac OS), как PowerShell не обрабатывает «\ г»

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() 

Он использует requests library так что вам необходимо установить, что. Это выводит что-то вроде следующего в консоли:

>Downloading download.data

>[=============                            ]

строка прогресса 52 символов шириной в скрипте (2 символа являются просто [] так 50 символов прогресса). Каждый = представляет 2% загрузки.

+0

Как я могу применить это к этому URL-адресу http: // indy/abcde1245 – user1607549

+1

@ user1607549 обновлено для использования с вашей ссылкой на образец – Endophage

+0

запросов нигде не определено – user1607549

44

Вы можете использовать «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 

Он должен работать и на нескольких платформах! Вы нажмете can also change бар на точки или счетчик с .dots и .mill вместо .bar.

Наслаждайтесь!

+1

было бы здорово, если бы это могло быть частью стандартной библиотеки python. –

+0

что такое 'путь'? –

+0

Путь - это имя файла, который вы хотите сохранить. – tshrinivasan

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) 

Наслаждайтесь!

+1

click также является частью стандартной библиотеки python3.6, поэтому нет необходимости в дополнительной установке – MortenB

+0

@MortenB Это так? Я получаю 'ModuleNotFoundError: нет модуля с именем 'click'' на 3.6.1. – nyuszika7h

0

Вы можете скачивать файлы, как они есть здесь ->Stream a Download.

Также вы можете Stream Uploads.

Наиболее важным потоковый запрос выполняется, если вы пытаетесь получить доступ к response.content только с 2 линиями

for line in r.iter_lines():  
    if line: 
     print(line) 

Stream Requests