我正在尝试更改进度条(版本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中的文档但我在那里给出的任何示例中找不到我的问题的答案。
答案 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获取输出,解析它以获取值,并手动进行数学运算。