python控制台中实现进度条功能


Posted in Python onNovember 10, 2015

我们大多数人都希望写一些简单的python脚本的同时都想能够在程序运行的过程中实现进度条的功能以便查看程序运行的速度或者进度。今天就和大家探讨这个问题:如何在python控制台中实现进度条功

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

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

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

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

举个例子:

import sys, time

for i in range(5):
 sys.stdout.write('{0}/5\r'.format(i + 1))
 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)

就可以完成所需任务了。

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

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

# -*- coding:utf-8 -*-

# Copyright: Lustralisk
# Author: Cedric Liu
# Date: 2015-11-08

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查找相似单词的方法
Mar 05 Python
Python中用PIL库批量给图片加上序号的教程
May 06 Python
Python使用filetype精确判断文件类型
Jul 02 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
Django使用HttpResponse返回图片并显示的方法
May 22 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
Django跨域请求原理及实现代码
Nov 14 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 Python
使用Python发送各种形式的邮件的方法汇总
Nov 09 #Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 #Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 #Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 #Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 #Python
Python实现模拟时钟代码推荐
Nov 08 #Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 #Python
You might like
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
Angular路由简单学习
2016/12/26 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
layerUI下的绑定事件实例代码
2018/08/17 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
Vue 实现简易多行滚动"弹幕"效果
2020/01/02 Javascript
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
python如何实现int函数的方法示例
2018/02/19 Python
python之文件读取一行一行的方法
2018/07/12 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
关于python 跨域处理方式详解
2020/03/28 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
Python super()方法原理详解
2020/03/31 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
Python sorted对list和dict排序
2020/06/09 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
代理班主任的自我评价
2014/02/04 职场文书
致共产党员倡议书
2014/04/16 职场文书
会计系毕业生求职信
2014/05/28 职场文书
2014年业务工作总结
2014/11/17 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL