如何在进度条和Python中显示mb / s而不是b / s?

时间:2016-08-25 15:51:09

标签: python python-3.x format progress-bar transfer

我正在尝试更改进度条(版本2)在Python 3中显示已传输/总文件大小的方式。以下是代码:

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 of 3714474 |时间:00:00:08

     

文件大小:3.54 MB

我希望能够 3714474 "" 3397632 以MB格式显示(如 file_size_mb 变量),而不是字节,因为默认情况下由进度条显示。

我已经阅读了Progress Bar’s documentation中的文档但我在那里给出的任何示例中找不到我的问题的答案。

2 个答案:

答案 0 :(得分:1)

使用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()]

默认情况下,DataSize小部件显示当前值,但您可以通过传递它来指定您希望它显示最大值" max_value"作为变量参数。

问题是它没有记录,你必须检查代码才能找到这些信息。所以这可以在一天内更改,而不再使用更高版本的模块。

考虑the DataSize doc,您似乎可以通过将自定义值传递给 format 参数来更改默认格式。默认格式为

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

我认为你可以通过指定这种格式获得两个十进制数字:

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

关于显示的单位,doc提到了默认为

的前缀参数
prefixes=('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi')

你可能会传递另一个带有你想要的前缀的元组。但在此之前考虑这个article discussing about binary prefixes。如果您使用1024的幂来转换您的单位,并且如果您想要准确,那么您可能希望使用IEC二进制前缀与" i"字符。

另一种,但更长的方式来实现你想要的是导出SimpleProgress类来制作一个适合你需要的类。

答案 1 :(得分: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获取输出,解析它以获取值,并手动进行数学运算。