相信很多人在写一些简单的Python脚本的时候都希望能够在程序运行的过程中实现进度条的功能以便查看程序运行的速度或者进度。

我之前一直想实现这样一个东西,也查看了许多博客但是都找不到一个完美的解决方案(当然,使用progressBar这个库是个选择,但很多时候我们需要一些定制功能的时候就需要考虑自己实现,其实也挺简单的,不想看废话的可以直接跳到最后)

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

然而当执行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)

效果如下:

--------------------------------------------------------------------------------

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

如果有什么其他好的建议欢迎共同讨论~

博客中全部资源均出自开源资源或者公开论文。 欢迎共同探讨交流。 联系方式:lsc_lsc_lsc_lsc@163.com

下面关于Python的文章您也可能喜欢,不妨看看:

Python 的详细介绍:请点这里

Python 的下载地址:请点这里

python里进度条编程_Python实现控制台中的进度条相关推荐

  1. python在哪里写编程_Python编程入门介绍

    编程-就是让计算机代为解决某个问题,对某个计算体系规定一定的计算方式,使计算体系按照计算方式运行,并最重得到结果的过程. 编程的语言有很多种,比如Python,JAVA,JavaScript,c++, ...

  2. python极客项目编程_Python极客项目编程 ([美]Mahesh Venkitachalam) 中文pdf完整版

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过Python编程,我们能够解决现实生活中的很多任务.Python极客项目编程通过14个有趣的项目,帮助和鼓励读者探索Python ...

  3. python语言支持函数式编程_python是函数式语言么

    函数式编程:functional,是一种编程范式. 函数式编程的特点:1. 把计算视为函数而非指令 2. 纯函数式编程:不需要变量,没有副作用,测试简单 3. 支持高阶函数,代码简洁 Python支持 ...

  4. python处理excel实例编程_python处理Excel的简单示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Python中一般使用xlrd库来读取Excel文件,使用xlwt库来生成Excel文件,使用xl ...

  5. python里str什么意思_python里的str是什么意思

    python中srt的全称是SubRip Text,srt文件打开方式srt文件可以使用系统自带的文本处理器来打开,比如notepad.exe,write.exe,word等文件处理软件.在Pytho ...

  6. python里range什么意思_python里range的意思是什么

    python里range的意思是什么 发布时间:2020-07-14 11:48:05 来源:亿速云 阅读:89 本篇文章为大家展示了python里range的意思是什么,代码简明扼要并且容易理解,绝 ...

  7. python 函数进度条怎么_python输出结果刷新及进度条的实现操作

    print函数 python输出主要使用print函数,print函数介绍: print(*objects, sep=" ", end=" ", file=sy ...

  8. python莱布尼茨法计算π_python圆周率计算(带进度条)

    3.波尔文四次迭代式 这个公式由乔纳森·波尔文和彼得·波尔文于1985年发表的. bailey-borwein-plouffe算法 这个公式简称BBP公式,由David Bailey, Peter B ...

  9. python写界面进度条程序_Python中如何写控制台进度条的整理

    进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输 ...

最新文章

  1. Python计算机视觉——照相机模型与增强现实
  2. (23)zabbix单位符号Unit symbols
  3. C# WMI 编程实例2则
  4. MySQL--数据库基础
  5. TeaPot 用webgl画茶壶(3) 环境纹理和skybox
  6. UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  7. (23)FPGA面试技能提升篇(SSC接口、V35接口)
  8. python编程技术总结_Python面向对象编程(OOP)技术总结
  9. Java——File类,递归
  10. 50家大厂面试万字精华总结,高性能mysql第五版pdf
  11. SBUS2 协议初探
  12. Python Excel 批量生成二维码
  13. linux 终端翻译,linux下终端使用有道翻译
  14. 在线文件管理html,KODExplorer可道云-开源Web在线文件管理系统
  15. HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板
  16. 使用windows自带虚拟机---Hyper-V 管理器
  17. 细说C++11中ratio编译期分数(一)
  18. 泌尿系统CT成像-常识
  19. java学习(多线程)
  20. 【Python】asyncio的使用(async、await关键字)

热门文章

  1. Nginx Lua读取redis 进行权限认证操作
  2. 存数字,储未来——新华三2018存储瞄准闪存、海量、AI与超融合
  3. [转]如何阅读systemstate dump
  4. C++三大特性之多态
  5. 菜鸟系列之C/C++经典试题(七)
  6. 界面排版-TableLayout的stretchColumns方法
  7. 《C语言及程序设计》实践参考——太乐了
  8. heartbeat双机热备配置(适用centos6\rhel6)
  9. GraphQL API 的查询语言
  10. 提升工作效率的优秀工具收藏