Python实现控制台中的进度条功能代码


Posted in Python onDecember 22, 2017

进度条最主要的问题就是所有字符全部在同一行,而且可以修改。

然而当执行print语句的时候,python会在打印完这个语句的同时在结尾加上‘\n',也就是换行,这就导致在控制台下一旦被print之后就无法再修改了。所以我们现在的输出就不能再使用print来完成了。

我们要使用的是来自sys库的sys.stdout.write()函数,这个函数会在控制台输出这个字符串的同时不加上任何结尾,这就意味着这个输出还没有完全结束。通过sys.stdout.flush()函数可以把输出暂时打印在控制台中(造成print的假象,我们姑且先叫这个假输出)。那么如果我们使用‘r'这个转义字符(回到行首),一切看起来是不是就合理很多了呢?

也就是说:打印字符串的时候,没有加上'\n',同时让光标回到行首,再把当前缓冲区显示出来,也就好象是print了一样,但是这时候光标还在原来的位置。

一个例子

[经测试,在Linux终端中执行才有效果,pycharm中调试输出没有效果]

import sys, time
for i in range(5):
 sys.stdout.write('HELLO: %05d' % i)
 sys.stdout.flush()
 time.sleep(1)

在终端下执行这段代码就会得到简单的进度条效果。

接下来还需要解决两个问题:

一:清空缓冲区

有些聪明的读者可能发现,当新的字符串比之前短的时候会出现问题,比如下面这段代码:

import sys, time
for i in range(5):
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

运行后发现结果跟我们希望的不太一样。

其实是因为已经被flush出去的字符并不会主动清空,所以只有新写入的被修改了。针对这点我目前的解决方案是先输出一波空格把之前的字符串冲掉然后重新写:

import sys, time

for i in range(5):
sys.stdout.write(' ' * 10 + '\r')
sys.stdout.flush()
sys.stdout.write(str(i) * (5 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

二:固定底边输出

有时候我们希望在进度条加载的同时还有一些其他的输出。

我们不妨在刷新掉上一次输出之后输出所需输出的字符串,然后在假输出进度条。

采用如下代码:

import sys, time
for i in range(5):
 sys.stdout.write(' ' * 10 + '\r')
 sys.stdout.flush()
 print i
 sys.stdout.write(str(i) * (5 - i) + '\r')
 sys.stdout.flush()
 time.sleep(1)

就可以完成所需任务了。

怎么样,其实原理还是挺简单的吧?

这里给出一个自己实现的类用来打印进度条:

import sys, time
class ProgressBar:
 def __init__(self, count = 0, total = 0, width = 50):
  self.count = count
  self.total = total
  self.width = width
 def move(self):
  self.count += 1
 def log(self, s):
  sys.stdout.write(' ' * (self.width + 9) + '\r')
  sys.stdout.flush()
  print s
  progress = self.width * self.count / self.total
  sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total))
  sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r')
  if progress == self.width:
   sys.stdout.write('\n')
  sys.stdout.flush()
bar = ProgressBar(total = 10)
for i in range(10):
 bar.move()
 bar.log('We have arrived at: ' + str(i + 1))
 time.sleep(1)

效果如下:

Python实现控制台中的进度条功能代码

这样就可以方便的在一些任务中查看程序运行的进度了,比如爬虫、机器学习等并不知道要花多少时间等工作也都可以有形象的时间把握了。

以上这篇Python实现控制台中的进度条功能代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
python中管道用法入门实例
Jun 04 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python如何快速实现分布式任务
Jul 06 Python
python爬虫爬取某站上海租房图片
Feb 04 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
python实现发送form-data数据的方法详解
Sep 27 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
利用Python+OpenCV三步去除水印
May 28 Python
python可视化大屏库big_screen示例详解
Nov 23 Python
Python中的探索性数据分析(功能式)
Dec 22 #Python
Python反射用法实例简析
Dec 22 #Python
Python文本特征抽取与向量化算法学习
Dec 22 #Python
用Python实现KNN分类算法
Dec 22 #Python
Python数据拟合与广义线性回归算法学习
Dec 22 #Python
python 动态加载的实现方法
Dec 22 #Python
Python决策树分类算法学习
Dec 22 #Python
You might like
php实现用于计算执行时间的类实例
2015/04/18 PHP
php封装实现钉钉机器人报警接口的示例代码
2020/08/08 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
Python实现Linux监控的方法
2019/05/16 Python
python创建子类的方法分析
2019/11/28 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
2021/03/03 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
租赁意向书范本
2014/04/01 职场文书
大学社团活动总结
2014/04/26 职场文书
村党支部书记承诺书
2014/05/29 职场文书
节约粮食标语
2014/06/18 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
高中社区服务活动报告
2015/02/05 职场文书
2015年推普周活动方案
2015/05/06 职场文书
民事答辩状格式范文
2015/05/21 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python