2016-08-25 10 views
0

Я пытаюсь изменить способ ProgressBar (версия 2) отображает переданную/общий размер файла в Python 3. Вот код:Как отображать mb/s вместо b/s в progressbar и Python?

import progressbar 
import requests 

url = 'http://download.openbricks.org/sample/H264/big_buck_bunny_1080p_H264_AAC_25fps_7200K_short.MP4' 

request = requests.get(url, stream=True) 

file   = open('test.mp4', 'wb') 
file_size = int(request.headers['Content-Length']) 
file_size_mb = round(file_size/1024/1024,2) 

chunk_sz = 512 

widgets = [progressbar.Bar(marker="#",left="[",right="]"), 
      progressbar.Percentage()," | ", 
      progressbar.FileTransferSpeed()," | ", 
      progressbar.SimpleProgress()," | ", 
      progressbar.ETA()] 

bar = progressbar.ProgressBar(widgets=widgets, maxval=file_size).start() 

i = 0 

for chunk in request.iter_content(chunk_size=chunk_sz): 
    file.write(chunk) 
    i += len(chunk) 
    bar.update(i) 

bar.finish() 
print('File size: {0} MB'.format(file_size_mb)) 

file.close() 

Выход:

[#### ##################### 91% | 741,3 KiB/s | 3397632 из 3714474 | Время: 00:00:08

Размер файла: 3,54 MB

Я хочу, чтобы иметь возможность сделать « из » будет отображаться в формате МБ (например, в file_size_mb), а не в байтах, поскольку по умолчанию он отображается по умолчанию.

Я прочитал документы в Progress Bar’s documentation, но я не смог найти ответ на свой вопрос в любом из приведенных здесь примеров.

+0

Вы пытались просто передать 'file_size_mb' в конструктор ProgressBar вместо' file_size'? – Tryph

+0

вы также можете увидеть виджет DataSize: http://progressbar-2.readthedocs.io/en/latest/progressbar.widgets.html#progressbar.widgets.DataSize – Tryph

+0

Я попробовал, да. Однако это не работает. Бар думает, что он должен скачать, что в байтах все еще так, он быстро заполняется до 100%. О виджетах DataSize, я прочитал об этом в предоставленной вами ссылке, однако я не думаю, что я это понял. Может быть, потому, что я относительно новичок в Python или даже в программировании, но могу ли я помешать вам разобраться на примере? Благодаря! – ZZZ

ответ

0

вы можете получить этот вид дисплея сравнительно легко с DataSize виджетом:

[######         ] 17% | 256.0 KiB/s | 631.0 KiB/ 3.5 MiB | ETA: 0:00:11 

вы можете сделать это путем замены SimpleProgress виджетов два DataSize виджетов, как показано ниже:

widgets = [progressbar.Bar(marker="#",left="[",right="]"), 
      progressbar.Percentage(), " | ", 
      progressbar.FileTransferSpeed(), " | ", 
      progressbar.DataSize(), "/", 
      progressbar.DataSize(variable="max_value"), " | ", 
      progressbar.ETA()] 

По default, виджет DataSize отображает текущее значение, но вы можете указать, что вы хотите, чтобы он отображал максимальное значение, передав его «max_value» как переменная параметр.

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

Учитывая, что the DataSize doc, вы можете изменить формат по умолчанию, передав настраиваемое значение в формат.По умолчанию используется формат

format='%(scaled)5.1f %(prefix)s%(unit)s' 

Я думаю, что вы могли бы получить два десятичных числа, указав формат:

format='%(scaled)5.2f %(prefix)s%(unit)s' 

Что касается отображения блока, док упоминает параметр префиксов, который по умолчанию

prefixes=('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi') 

Возможно, вы можете передать другой кортеж с префиксами, которые вы хотите. Но подумайте об этом article discussing about binary prefixes, прежде чем делать это. Если вы используете полномочия 1024 для преобразования ваших единиц, и если вы хотите быть точным, то вы, вероятно, захотите использовать бинарные префиксы IEC с символом «i».


Другим, но больше, способ добиться того, что вы хотите бы вывести SimpleProgress класс, чтобы тот, который подходит вам нужно.

+0

Awesome! Я собираюсь попробовать, когда я вернусь с работы! Еще раз спасибо! – ZZZ

+0

PS Как вы думаете, я мог бы сделать это показом 2 десятичных знака вместо 1? Как и в 3.54 MiB (каков фактический размер файла в примере). А как насчет номенклатуры «MiB»? Не стоит ли вместо этого «MB»? – ZZZ

+0

@ user349326 ответ отредактирован реагировать, чтобы соответствовать наши дополнительные вопросы – Tryph

0

Из progressbar документации:

class progressbar.widgets.SimpleProgress(format=’%(value)d of %(max_value)d’, 
max_width=None, **kwargs) 

Bases: progressbar.widgets.FormatWidgetMixin, progressbar.widgets.WidgetBase 

Returns progress as a count of the total (e.g.: “5 of 47”) 

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

widgets = [progressbar.Bar(marker="#",left="[",right="]"), 
      progressbar.Percentage()," | ", 
      progressbar.FileTransferSpeed()," | ", 
      progressbar.SimpleProgress(format='%(value/1024/1024)d of %(max_value/1024/1024)d')," | ", 
      progressbar.ETA()] 

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

+0

К сожалению, вы не можете. Это то, что меня смутило во многом. Вот результат, когда я пытаюсь сделать это, как указано: http://pastebin.com/HbiqVYeL (ошибка довольно большая, поэтому я не буду вставлять ее здесь. Для второго предложения, однако, я не знаю как я это сделаю.Я имею в виду, как бы я вставлял информацию обратно в список виджетов или использовал ее для обновления строки? Извините, если я выгляжу как новичок в Python, но это именно то, что я есть. – ZZZ