Python显示进度条
一、进度条实现原理
进度条和一般的print区别在哪里呢? 答案就是print会输出一个n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。 进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?
实现进度条最简单的办法就是,在输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。
二、实现方法
1、r转义实现
转义符r就可以把光标移动到行首而不换行,转义符n就把光标移动到行首并且换行。 在python中,输出stdout(标准输出)可以使用sys.stdout.write 例如:
1#!/usr/bin/env python
2# -*- coding=utf-8 -*-
3#Using GPL v2
4"""
5Usage:
6Just A Template
7"""
8from __future__ import division
9import sys,time
10j = '#'
11if __name__ == '__main__':
12 for i in range(1,61):
13 j += '#'
14 sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"r")
15 sys.stdout.flush()
16 time.sleep(0.5)
17print
2、b转义实现法
第二种思路是用转义符b 转义符b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:
1#!/usr/bin/env python
2# -*- coding=utf-8 -*-
3#Using GPL v2
4"""
5Usage:
6Just A Template
7"""
8from __future__ import division
9import sys,time
10if __name__ == '__main__':
11 for i in range(1,61):
12 sys.stdout.write('#'+'->'+"bb")
13 sys.stdout.flush()
14 time.sleep(0.5)
15print
3、progressbar模块实现法
python一个比较强大方便的地方,就是有各种别人做好的类库。我们只需要通过import引入即可。这里可以用下progressbar模块(目前最新版是2.3开发版),效果如下:
上图中使用的是稳定版2.2的版本。四个示例的示码如下(在该模块的progressbar.py文件中可以查到):
1def example1():
2 widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),
3 ' ', ETA(), ' ', FileTransferSpeed()]
4 pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
5 for i in range(1000000):
6 # do something
7 pbar.update(10*i+1)
8 pbar.finish()
9 print
10 def example2():
11 class CrazyFileTransferSpeed(FileTransferSpeed):
12 "It's bigger between 45 and 80 percent"
13 def update(self, pbar):
14 if 45 < pbar.percentage() < 80:
15 return 'Bigger Now ' + FileTransferSpeed.update(self,pbar)
16 else:
17 return FileTransferSpeed.update(self,pbar)
18 widgets = [CrazyFileTransferSpeed(),' <<<', Bar(), '>>> ', Percentage(),' ', ETA()]
19 pbar = ProgressBar(widgets=widgets, maxval=10000000)
20 # maybe do something
21 pbar.start()
22 for i in range(2000000):
23 # do something
24 pbar.update(5*i+1)
25 pbar.finish()
26 print
27 def example3():
28 widgets = [Bar('>'), ' ', ETA(), ' ', ReverseBar('<')]
29 pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
30 for i in range(1000000):
31 # do something
32 pbar.update(10*i+1)
33 pbar.finish()
34 print
35 def example4():
36 widgets = ['Test: ', Percentage(), ' ',
37 Bar(marker='0',left='[',right=']'),
38 ' ', ETA(), ' ', FileTransferSpeed()]
39 pbar = ProgressBar(widgets=widgets, maxval=500)
40 pbar.start()
41 for i in range(100,500+1,50):
42 time.sleep(0.2)
43 pbar.update(i)
44 pbar.finish()
45 print
4、progressive模块
progressive模块只适用于python2.7以上的版本。效果如下:
progressive模块的安装方法如下:
1pip install progressive
2或
3git clone https://github.com/hfaran/progressive.git
4cd progressive
5python setup.py install
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-progress-bar/3781.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.