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实现通过继承覆盖方法示例
Jul 02 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python实战购物车项目的实现参考
Feb 20 Python
python实现对输入的密文加密
Mar 20 Python
简单了解python高阶函数map/reduce
Jun 28 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
快速查找Python安装路径方法
Feb 06 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
如何利用python实现列表嵌套字典取值
Jun 10 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中stream(流)的用法
2014/03/25 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python的函数的一些高阶特性
2015/04/27 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Python获取网段内ping通IP的方法
2019/01/31 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python实现登录与注册系统
2020/11/30 Python
python tqdm库的使用
2020/11/30 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
中国梦演讲稿范文
2014/08/28 职场文书
文明单位申报材料
2014/12/23 职场文书
老公出轨后的保证书
2015/05/08 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
反邪教观后感
2015/06/11 职场文书
初中政治教学工作总结
2015/08/13 职场文书
MySQL数据库查询之多表查询总结
2022/08/05 MySQL