人类的进度工具
项目描述
进度条 - 蛇的进度工具
/----------------------------------------------------------------------------------\
| |
@..@ /| [###.......] Progress: 34.2MB / 125.8MB | 25.0% | Time: 14min3s | ETA: 19min52s |
(----) / | |
( >__< ) \----------------------------------------------------------------------------------/
^^ ~~ ^^
进度条是一个小型的进度指示工具,用于快速原型设计。为什么叫进度条呢?因为它通常是一个条形图,它会跳到你的终端上,这就是原因!
- 不会打断你的工作流程(在大多数情况下,无需调用进度条来渲染自身)
- 它可以猜测你是否在迭代一个列表(或类似的可迭代对象)...
- 或者迭代一个文件...
- 或者迭代生成器 - 假设你知道它的总长度...
- 或者不是!(没有eta,没有总步骤,没有百分比,只有一个指示器而不是条形图,但它仍然可以工作!)
- 并且你可以轻松地教它如何在使用lxml解析时显示大、gzip压缩的xml文件的进度
- 支持Python 2.6+、Python 3、PyPy
- 完全测试
迭代示例
迭代一个列表
>>> import frogress
>>> items = [1, 2, 3, 4, 5]
>>> for item in frogress.bar(items):
... pass # do something with item
[##........] Step 2/5 | 20.0% | Time: 0.1s | ETA: 0.5s
迭代一个文件
>>> import frogress
>>> for line in frogress.bar(open('/path/to/file', steps_label='Progress')):
... pass # do something cruel with a line
[###.......] Progress: 3.2MB / 12.8MB | 25.0% | Time: 14min3s | ETA: 19min52s
迭代生成器
>>> import frogress
>>> count = 100
>>> items = range(count)
>>> for item in frogress.bar(items, steps=count):
... pass # do something with item
[#########.] Step 86/100 | 86.0% | Time: 1.2s | ETA: 7.3s
迭代一个未知总步骤数的生成器
>>> import frogress
>>> def counter():
... num = 1
... while True:
... yield num
... num += 1
...
>>> items = counter()
>>> for item in frogress.bar(items):
... pass # do something with item
[........#.] Step: 1410 | Time: 2min14s
[.........#] Step: 1411 | Time: 2min15s
[........#.] Step: 1412 | Time: 2min16s
[.......#..] Step: 1413 | Time: 2min17s
使用lxml迭代gzip压缩的xml文件
如何呈现正在处理的文件的进度的问题是frogress应从哪个来源提取进度信息。我们可以尝试以这种方式(不知道已处理的文件有多少内容)或给进度条
一个来源。
简单方法
>>> import frogress
>>> import gzip
>>> from lxml.etree import iterparse
>>> stream = gzip.open('my-fat.xml.gz')
>>> context = iterparse(stream)
>>> for action, element in frogress.bar(context):
... pass # do something with element
... element.clear() # don't forget about the memory!
[...#......] Progress: 41923 | Time: 1h42min
这完全没问题:我们传递了一个不提供总处理项目信息的可迭代对象 - 因此我们有一个活动指示器,没有总步骤数,也没有eta。
然而,显然有一种方法可以检索这些信息——毕竟这只是一个正在处理的文件。并且该文件应作为 source
参数传递给 frogress.bar
函数。
传递源
>>> import frogress
>>> import gzip
>>> from lxml.etree import iterparse
>>> stream = gzip.open('my-fat.xml.gz')
>>> context = iterparse(stream)
>>> for action, element in frogress.bar(context, source=stream.myfileobj):
... pass # do something with element
... element.clear() # don't forget about the memory!
[#####.....] Progress: 73.5MB / 156.4MB | 47.3% | Time: 1h42min | ETA: 1h53min
只需记住传递实际处理的文件,而不是包装器!标准文件将直接传递,但在示例中,gzip
模块将其正在处理的流包装,并且它作为属性 myfileobj
可用。另一方面,bz2
模块不会包装流。等等。frogress
可以猜测一个流是否为类似文件的对象,但传递适当的源是用户的责任。
没有实际可迭代的旋转器
有时我们只想表明程序正在做某事,但我们真的不知道它需要多长时间(例如,执行几个 API 请求)。
示例
import frogress
import time
def cmd(s=0):
time.sleep(s)
def main():
with frogress.spinner("Waiting for response 1", done="OK"):
cmd(0.5)
with frogress.spinner("Waiting for response 2", done="Done"):
cmd(0.5)
with frogress.spinner("Waiting for response 3", done="All done, really!"):
cmd(0.5)
main()
进度条类 API
大多数时候,您不需要直接调用这些 API —— frogress.bar
函数应该适用于大多数用例。但是,如果您觉得需要做一些定制,这里有一些示例。
>>> import frogress
>>> items = [1, 2, 3, 4, 5]
>>> progressbar = frogress.Bar(items)
>>> progressbar.step
0
>>> progressbar.started # it's still None
>>> progressbar.finished # here too
>>> for item in progressbar:
... pass # process the item (it will draw progressbar during iteration)
>>> progressbar.step
5
>>> progressbar.widgets
[<BarWidget>, <ProgressWidget>, <PercentageWidget>, <EtaWidget>, <TimeWidget>]
>>> len(progressbar)
5
>>> progressbar.output
<open file '<stderr>', mode 'w' at 0x103df61e0>
>>> progressbar.started
datetime.datetime(2013, 5, 12, 22, 2, 26, 752454)
>>> progressbar.finished
datetime.datetime(2013, 5, 12, 22, 2, 26, 792901)
技巧 & 技巧
如何更改进度小部件的标签
>>> import frogress
>>> items = [1, 2, 3, 4, 5]
>>> widgets = [frogress.BarWidget, frogress.ProgressWidget('Items: '), frogress.TimerWidget]
>>> for item in frogress.bar(items, widgets=widgets):
>>> pass
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。
源分发
frogress-0.10.1.tar.gz (19.3 kB 查看哈希值)
构建分发
frogress-0.10.1-py3-none-any.whl (15.2 kB 查看哈希值)