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的yield和generator
Mar 10 Python
详解Python迭代和迭代器
Mar 28 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python实现杨辉三角思路
Jul 14 Python
Python机器学习之SVM支持向量机
Dec 27 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
python实现发送form-data数据的方法详解
Sep 27 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 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
ftp类(example.php)
2006/10/09 PHP
MySQL授权问题总结
2007/05/06 PHP
php MsSql server时遇到的中文编码问题
2009/06/11 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
js变换显示图片的实例
2013/04/16 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
javascript作用域链(Scope Chain)用法实例解析
2015/11/30 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
jQuery插件HighCharts实现的2D堆条状图效果示例【附demo源码下载】
2017/03/14 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
python 编码规范整理
2018/05/05 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
空指针到底是什么
2012/08/07 面试题
四下基层实施方案
2014/03/28 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
先进班集体申报材料
2014/12/26 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers