一、进度条实现原理

进度条和一般的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
23git clone https://github.com/hfaran/progressive.git
4cd progressive
5python setup.py install