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基础语法(Python基础知识点)
Feb 28 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
python 函数中的参数类型
Feb 11 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
详解Python函数print用法
Jun 18 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
Apr 13 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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--用万网的接口实现域名查询功能
2012/12/13 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
详解Python3的TFTP文件传输
2018/06/26 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
python实现在一个画布上画多个子图
2020/01/19 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
美国知名艺术画网站:Art.com
2017/02/09 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
环保公益广告语
2014/03/13 职场文书
安全生产年活动总结
2014/08/29 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书
oracle索引总结
2021/09/25 Oracle
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL