进度条和一般的print区别在哪里呢?
答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。
进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?
最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。
可以想到那个转义符了吧,那就是 \r。
转义符\r就可以把光标移动到行首而不换行,转义符\n就把光标移动到行首并且换行。
在python中,输出stdout(标准输出)可以使用sys.stdout.write
例如:
-
#!/usr/bin/env python
-
# -*- coding=utf-8 -*-
-
#Using GPL v2
-
#Author: ihipop@gmail.com
-
##2010-10-27 22:07
-
"""
-
Usage:
-
Just A Template
-
"""
-
from __future__ import division
-
-
import sys,time
-
j = '#'
-
if __name__ == '__main__':
-
for i in range(1,61):
-
j += '#'
-
sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"\r")
-
sys.stdout.flush()
-
time.sleep(0.5)
-
print
第二种思路是用转义符\b
转义符\b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:
-
#!/usr/bin/env python
-
# -*- coding=utf-8 -*-
-
#Using GPL v2
-
#Author: ihipop@gmail.com
-
#2010-10-27 22:07
-
"""
-
Usage:
-
Just A Template
-
"""
-
from __future__ import division
-
-
import sys,time
-
if __name__ == '__main__':
-
for i in range(1,61):
-
sys.stdout.write('#'+'->'+"\b\b")
-
sys.stdout.flush()
-
time.sleep(0.5)
-
print
光标回退2格,写个#再回退,再写,达到增长的目的了
不过写这么多似乎是废话,在耳边常常听到一句话:那就是不要重复造轮子。实际上python有丰富发lib帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节
下面要介绍的就是这个类“”(),使用可以方便的安装这可个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以import过来
下面就是基本使用举例:
-
#!/usr/bin/env python
-
# -*- coding=utf-8 -*-
-
#Using GPL v2
-
#Author: ihipop@gmail.com
-
#2010-10-27 22:53
-
"""
-
Usage:
-
Just A Template
-
"""
-
from __future__ import division
-
-
import sys,time
-
from progressbar import *
-
total = 1000
-
-
#基本用法
-
progress = ProgressBar()
-
for i in progress(range(total)):
-
time.sleep(0.01)
-
-
pbar = ProgressBar().start()
-
for i in range(1,1000):
-
pbar.update(int((i/(total-1))*100))
-
time.sleep(0.01)
-
pbar.finish()
-
-
#高级用法
-
widgets = ['Progress: ', Percentage(), ' ', Bar(marker=RotatingMarker('>-=')),
-
' ', ETA(), ' ', FileTransferSpeed()]
-
pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
-
for i in range(1000000):
-
# do something
-
pbar.update(10*i+1)
-
time.sleep(0.0001)
-
pbar.finish()
官方示例下载,移步这里:
再发一个类:
-
#!/usr/bin/env python
-
# -*- coding=utf-8 -*-
-
#Using GPL v2
-
#Author: ihipop@gmail.com
-
#2010-10-30 13:59
-
"""
-
Usage:
-
Just A Template
-
"""
-
class progressbarClass:
-
def __init__(self, finalcount, progresschar=None):
-
import sys
-
self.finalcount=finalcount
-
self.blockcount=0
-
#
-
# See if caller passed me a character to use on the
-
# progress bar (like "*"). If not use the block
-
# character that makes it look like a real progress
-
# bar.
-
#
-
if not progresschar: self.block=chr(178)
-
else: self.block=progresschar
-
#
-
# Get pointer to sys.stdout so I can use the write/flush
-
# methods to display the progress bar.
-
#
-
self.f=sys.stdout
-
#
-
# If the final count is zero, don't start the progress gauge
-
#
-
if not self.finalcount : return
-
self.f.write('\n------------------- % Progress -------------------\n')
-
return
-
-
def progress(self, count):
-
#
-
# Make sure I don't try to go off the end (e.g. >100%)
-
#
-
count=min(count, self.finalcount)
-
#
-
# If finalcount is zero, I
Author Info :
From:Python中如何写控制台进度条的整理
URL:http://blog.ihipop.info/2010/10/1736.html
Please Reserve This Link,Thanks!
阅读(3626) | 评论(0) | 转发(0) |