51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Python 输出命令行进度条

在使用 pip 安装时,你会发现有下载进度条,我们也可以借助开源的第三方库来实现这个功能,在项目输出时增加一些可视化效果。

一个简单易用的第三方库是:progress

作者提供了动图很直观地展现了实现的所有输出。

image

这个库实现了两类样式,一类是有终点的进度条样式,另一类是多用于加载的转圈样式。

|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 | hljs python import time from progress.bar import Bar bar = Bar('Processing', max=100, fill='@', suffix='%(percent)d%%') for i in range(100): time.sleep(0.1) bar.next() bar.finish() |

参数定义的功能:

  • max:进度条最大进度
  • fill:进度条填充的字符
  • suffix:百分比的样式

运行上述代码会得到输出

|-----------|---------------------------------------------------------------------| | 1 | hljs gauss Processing |@@@@@@ | 20% |

同时也提供上下文的用法(需要用 Github 里的源代码):

|-----------------|---------------------------------------------------------------------------------------------------------| | 1 2 3 4 | hljs python with Bar('Processing', max=20) as bar: for i in range(20): # Do some work bar.next() |

另一类转圈样式,用法和Bar类似,只要没达到终点就一直调用next方法即可

|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 | hljs python from progress.spinner import Spinner spinner = Spinner('Loading ') while state != 'FINISHED': # Do some work spinner.next() |

动图里的所有样式都是作者已经实现的派生类,用法基本都一样,当然也可以继承基础类来自己实现更多的功能。

|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 | hljs python class SlowBar(Bar): suffix = '%(remaining_hours)d hours remaining' @property def remaining_hours(self): return self.eta // 3600 |


上面介绍的库,实现的功能很简单,而且默认只能输出到终端。

如果有更复杂的使用场景,推荐使用另一个库:python-progressbar

这个库实现了更多功能,可以自定义组合出一个进度条样式,还可以指定输出流。

基本的使用很简单,可以直接传入迭代对象。

|-------------------|------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 | hljs python import time import progressbar for i in progressbar.progressbar(range(100)): time.sleep(0.02) |

输出如下:

|-----------|--------------------------------------------------------------------------------------------------| | 1 | hljs clean 70% (70 of 100) |################ | Elapsed Time: 0:00:01 ETA: 0:00:00 |

也可以生成对象后调用update方法 。

|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 | hljs python import time import progressbar bar = progressbar.ProgressBar(max_value=100) for i in range(100): time.sleep(0.1) bar.update(i) |

最有特点之处就是可以自定义组件,比如我们来实现类似于动图中转圈加载的样式。

|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | hljs python import time import progressbar widgets = \[ 'Loading: ', '\[', progressbar.AnimatedMarker(), '\]', ' ', progressbar.Timer() \] bar = progressbar.ProgressBar( widgets=widgets, max_value=progressbar.UnknownLength) for i in range(100): time.sleep(0.5) bar.update(i) |

输出样式是这样的,方括号中的会一直旋转

|-----------|----------------------------------------------------------| | 1 | hljs apache Loading: \[\\\] Elapsed Time: 0:00:13 |

更多功能不再赘述,可以查看 GitHub 中的文档

赞(0)
未经允许不得转载:工具盒子 » Python 输出命令行进度条