Python中如何写控制台进度条的整理
2016-11-21 17:35
211 查看
进度条和一般的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帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节
下面要介绍的就是这个类“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安装这可个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以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()
官方示例下载,移步这里:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py
再发一个类:
#!/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'm done
#
if
self.finalcount:
percentcomplete=int(round(100*count/self.finalcount))
if
percentcomplete
< 1:
percentcomplete=1
else:
percentcomplete=100
#print
"percentcomplete=",percentcomplete
blockcount=int(percentcomplete/2)
#print
"blockcount=",blockcount
if
blockcount
> self.blockcount:
for
i
in
range(self.blockcount,blockcount):
self.f.write(self.block)
self.f.flush()
if
percentcomplete
== 100:
self.f.write("\n")
self.blockcount=blockcount
return
if
__name__
== "__main__":
from
time
import
sleep
pb=progressbarClass(8,"*")
count=0
while
count<9:
count+=1
pb.progress(count)
sleep(0.2)
答案就是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)
第二种思路是用转义符\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)
光标回退2格,写个#再回退,再写,达到增长的目的了
不过写这么多似乎是废话,在耳边常常听到一句话:那就是不要重复造轮子。实际上python有丰富发lib帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节
下面要介绍的就是这个类“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安装这可个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以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()
官方示例下载,移步这里:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py
再发一个类:
#!/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'm done
#
if
self.finalcount:
percentcomplete=int(round(100*count/self.finalcount))
if
percentcomplete
< 1:
percentcomplete=1
else:
percentcomplete=100
"percentcomplete=",percentcomplete
blockcount=int(percentcomplete/2)
"blockcount=",blockcount
if
blockcount
> self.blockcount:
for
i
in
range(self.blockcount,blockcount):
self.f.write(self.block)
self.f.flush()
if
percentcomplete
== 100:
self.f.write("\n")
self.blockcount=blockcount
return
if
__name__
== "__main__":
from
time
import
sleep
pb=progressbarClass(8,"*")
count=0
while
count<9:
count+=1
pb.progress(count)
sleep(0.2)
相关文章推荐
- 详解Python中如何写控制台进度条的整理
- Python中如何写控制台进度条的整理
- python在控制台输出进度条的方法
- Python如何在控制台显示进度条
- 如何在控制台写一个简单的进度条
- python在控制台输出进度条的方法
- Python如何处理大数据(知识整理)
- VScode&Python:如何在控制台进行输入,切换解释器版本
- 【整理】Python中,如何将反斜杠u类型(\uXXXX)的字符串,转换为对应的unicode的字符
- sublime text直接运行python程序时,如何在控制台输入数据?
- python实现一个控制台下的进度条
- 如何用python整理附件
- 【整理】如何学习Python + 如何有效利用Python有关的网络资源 + 如何利用Python自带手册(Python Manual)
- python输出中文——如何在Windows控制台打印不乱码
- 如何使用Python发送带附件的邮件
- 如何使用 Eseutil 实用工具 (Eseutil.exe) 进行碎片整理!
- 如何安装故障恢复控制台
- [Python]如何取出一个超大文本文件的最后几行
- 终于明白了KDevelop里面如何调试控制台程序了
- [ZT]如何在图形界面中实时捕获控制台程序的标准输出,让图形界面程序向控制台程序输入特定的命令行指令