Как написать индикатор прогресса загрузки в Python?

Я пишу небольшое приложение для загрузки файлов через http (как, например, описано здесь ).

Я также хочу включить небольшой индикатор прогресса загрузки, показывающий процент загрузки.

Вот что я придумал:

     sys.stdout.write (rem_file + "...")    
     urllib.urlretrieve (rem_file, loc_file, reporthook = dlProgress)

     def dlProgress (count, blockSize, totalSize):
       percent = int (count * blockSize * 100 / totalSize)
       sys.stdout.write ("% 2d %%"% процентов)
       sys.stdout.write ( "\ Ь \ Ь \ Ь")
       sys.stdout.flush ()

Выход: MyFileName … 9%

Любые другие идеи или рекомендации для этого?

Одна вещь, которая несколько раздражает, – это мигающий курсор в терминале на первой цифре процента. Есть ли способ предотвратить это? Есть ли способ скрыть курсор?

РЕДАКТИРОВАТЬ:

Здесь лучше использовать глобальную переменную для имени файла в dlProgress и код '\ r':

     глобальная переменная rem_file #, которая будет использоваться в dlProgress

     urllib.urlretrieve (rem_file, loc_file, reporthook = dlProgress)

     def dlProgress (count, blockSize, totalSize):
       percent = int (count * blockSize * 100 / totalSize)
       sys.stdout.write ("\ r" + rem_file + "...% d %%"% процентов)
       sys.stdout.flush ()

Выход: MyFileName … 9%

И курсор отображается в конце END. Намного лучше.

  • серьезно простой прокси-сервер python HTTP?
  • Скорость сканирующего сканирования медленная (60 страниц / мин)
  • Каков самый быстрый способ HTTP GET в Python?
  • Как загрузить файл через HTTP с помощью Python?
  • Как добавить заголовок в urllib2?
  • Как получить сертификат SSL-ответа от запросов в python?
  • Как отправить zip-файлы в фреймворк python?
  • Как отправить HTTP-запрос в Python?
  • 9 Solutions collect form web for “Как написать индикатор прогресса загрузки в Python?”

    Для python существует библиотека текстовых индикаторов выполнения на http://pypi.python.org/pypi/progressbar/2.2 , которые могут оказаться полезными:

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

    Класс ProgressBar управляет ходом, а формат строки задается рядом виджетов. Виджет – это объект, который может отображаться в зависимости от состояния хода. Существует три типа виджета: – строка, которая всегда показывает себя; – ProgressBarWidget, который может возвращать различное значение при каждом вызове метода обновления; и – ProgressBarWidgetHFill, который похож на ProgressBarWidget, за исключением того, что он расширяется, чтобы заполнить оставшуюся ширину линии.

    Модуль progressbar очень прост в использовании, но очень мощный. И автоматически поддерживает такие функции, как автоматическое изменение размера, когда доступно.

    Вы также можете попробовать:

     sys.stdout.write("\r%2d%%" % percent) sys.stdout.flush() 

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

    Если вы используете пакет curses , у вас гораздо больший контроль над консолью. Это также связано с более высокой стоимостью сложности кода и, вероятно, не нужно, если вы не разрабатываете большое консольное приложение.

    Для простого решения вы всегда можете поместить вращающееся колесо в конец посыльного статуса (последовательность символов |, \, -, / которая на самом деле выглядит красиво при мигающем курсоре.

    Для чего это стоит, вот код, который я использовал, чтобы заставить его работать:

     from urllib import urlretrieve from progressbar import ProgressBar, Percentage, Bar url = "http://......." fileName = "file" pbar = ProgressBar(widgets=[Percentage(), Bar()]) urlretrieve(url, fileName, reporthook=dlProgress) def dlProgress(count, blockSize, totalSize): pbar.update( int(count * blockSize * 100 / totalSize) ) 

    Я использовал этот код:

     url = (<file location>) file_name = url.split('/')[-1] u = urllib2.urlopen(url) f = open(file_name, 'wb') meta = u.info() file_size = int(meta.getheaders("Content-Length")[0]) print "Downloading: %s Bytes: %s" % (file_name, file_size) file_size_dl = 0 block_sz = 8192 while True: buffer = u.read(block_sz) if not buffer: break file_size_dl += len(buffer) f.write(buffer) status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size) status = status + chr(8)*(len(status)+1) print status, f.close() 

    Для небольших файлов вам может понадобиться использовать эти строки, чтобы избежать сумасшедших процентов:

    sys.stdout.write ("\ r% 2d %%"% процентов)

    sys.stdout.flush ()

    ура

    То, как я это сделал, может помочь вам: https://github.com/mouuff/MouDownloader/blob/master/api/download.py

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

     import urllib2 def urlretrieve(urllib2_request, filepath, reporthook=None, chunk_size=4096): req = urllib2.urlopen(urllib2_request) if reporthook: # ensure progress method is callable if hasattr(reporthook, '__call__'): reporthook = None try: # get response length total_size = req.info().getheaders('Content-Length')[0] except KeyError: reporthook = None data = '' num_blocks = 0 with open(filepath, 'w') as f: while True: data = req.read(chunk_size) num_blocks += 1 if reporthook: # report progress reporthook(num_blocks, chunk_size, total_size) if not data: break f.write(data) # return downloaded length return len(data) 
     def download_progress_hook(count, blockSize, totalSize): """A hook to report the progress of a download. This is mostly intended for users with slow internet connections. Reports every 5% change in download progress. """ global last_percent_reported percent = int(count * blockSize * 100 / totalSize) if last_percent_reported != percent: if percent % 5 == 0: sys.stdout.write("%s%%" % percent) sys.stdout.flush() else: sys.stdout.write(".") sys.stdout.flush() last_percent_reported = percent urlretrieve(url, filename, reporthook=download_progress_hook) 
    Python - лучший язык программирования в мире.