进度条最主要的问题就是所有字符全部在同一行,而且可以修改。然而当执行print语句的时候,python会在打印完这个语句的同时,在结尾加上换行‘\n’,这就导致在控制台下一旦被print之后就无法修改了。

我们需要使用的是来自sys.stdout.write()函数,这个函数会在控制台输出这个字符串的同时不加上任何结尾,这就意味着这个输出还没有完全结束。通过sys.stdout.flush()函数可以把输出暂时打印在控制台中(造成print的假象)。那么我们用‘\r’来回到行首。一切看起来那么简单了。

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

举个例子:

import sys, time
for i in range(10):
sys.stdout.write('{0}/10\r'.format(i + 1))
sys.stdout.flush()
time.sleep(1)

在终端下执行这段代码就会得到简单的进度效果。

接下来需要解决两个问题:

一、清空缓冲区:

当新的字符串比之前短的时候会出现问题,如下:

import sys, time
for i in range(10):
sys.stdout.write(str(i) * (10 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

运行后会发现,结果跟期望的不一样。

其实是因为已经被flush出去的字符并不会主动清空,所以只有新写入的被修改了。针对这点,我目前的解决方案是先输出一波空格,把之前的字符串冲掉,然后重写:

import sys, time
for i in range(10):
sys.stdout.write(str(i) * (10 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

二、固定底边输出:

有时候我们希望在进度条加载的同时,还有一些其他输出。不妨在刷新掉上一次输出之后输出所需输出的字符串,然后在假输出进度条。如下:

import sys, time
for i in range(10):
sys.stdout.write(' ' * 10 + '\r')
sys.stdout.flush()
print(i)
sys.stdout.write(str(i) * (10 - i) + '\r')
sys.stdout.flush()
time.sleep(1)

以后也可以给出一个自己实现的类来打印进度条:

class Process(object):
def __init__(self, id, wide=20):
self.id = id
self.wide = wide def log(self, line):
info = self.id*line + '{0}%'.format(int(line/self.wide*100)) + '\r'
sys.stdout.write(info)
sys.stdout.flush()
time.sleep(0.5) obj = Process('>>')
for i in range(20):
obj.log(i)

进度条

 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('#' * int(progress) + '-' * int(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的进度条实现的更多相关文章

  1. Python字符进度条

    Python字符进度条 看看这个神奇的module from tqdm import trange from time import sleep for r in trange(10, 1, -1): ...

  2. Python之进度条及π的计算

    Python之进度条及π的计算 文本进度条 1.  简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...

  3. Python实现进度条功能

    Python实现进度条功能 import sys, time def progress(percent, width=50): # 设置进度条的宽度 if percent >= 100: # 当 ...

  4. Python实现进度条和时间预估的示例代码

    一.前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  5. python print 进度条的例子

    def progress(width, percent): print "%s %d%%\r" % (('%%-%ds' % width) % (width * percent / ...

  6. python实现进度条

    先说一下文本系统的控制符: \r: 将光标移动到当前行的首位而不换行: \n: 将光标移动到下一行,并不移动到首位: \r\n: 将光标移动到下一行首位. 环境: root@ubuntu16:/ale ...

  7. python实现进度条和百分比同时显示

    python中同时打印进度条和百分比 仅打印进度条: import sys,time for i in range(100): sys.stdout.write('>') sys.stdout. ...

  8. 自主学习python文本进度条及π的计算

    经过自己一段时间的学习,已经略有收获了!在整个过程的进行中,在我逐渐通过看书,看案例,做题积累了一些编程python的经验以后,我发现我渐渐爱上了python,爱上了编程! 接下来,当然是又一些有趣的 ...

  9. python显示进度条

    当一个python任务是需要逐个处理相同的事物时(里面有循环操作,例如对一系列的文件进行处理),这时可以将处理的进度条加进来,下面是一个例子: import time import sys def v ...

  10. 从 Python 第三方进度条库 tqdm 谈起 (转载)

    原文地址: https://blog.ernest.me/post/python-progress-bar tqdm 最近一款新的进度条 tqdm 库比较热门,声称比老版的 python-progre ...

随机推荐

  1. ACM,算法

    ACM,算法 描述 最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数.他已经知道了第一个小光棍数是471,471的三次方是104487111,现在 ...

  2. audio标签的自动播放(ios)

    0.应用场景 前端移动端开发,经常有播放音乐的需求.比如我有公司做过类似支付宝的年度账单,功能是用户在查看年度账单的过程中播放轻音乐. 1.audio标签播放mp3 (一)常用属性和API介绍 1.c ...

  3. NDK编程jni学习入门,声明native方法,使其作为java与c的交互接口

    首先,新建工程,简历一个jave类,在其中声明native方法,关键字为native,表面这个方法是从java以为的语言实现. 其次,要实用javac编译此java文件(javac是jdk中的命令,需 ...

  4. android FrameLayout

    FrameLayout:帧布局,可以显示图片的动画效果 前景图像: 永远处于帧布局最顶的,直接面对用户的图像,,就是不会被覆盖的图片 常用属性: android:foreground:设置该帧布局容器 ...

  5. jquery的事件绑定on()动态绑定

    常用 这里有个文章列表, 通过on() 点击标题获取标题内容 <div class="article"> <div class="title" ...

  6. 【Java学习经历系列-1】19岁的我,没遇见生命中的她,却遇见了java

    [写在前面]正直青春年少的你,遇到了你的她了吗?还是你也和我们今天的主人公一样,在最美好的年级,正在为你的初衷努力着,坚持着,奔波着..... 作者:李伟   我的黑客时代 01 大学专业是电子信息工 ...

  7. Linux之Ubuntu基本命令提炼,分条列出

    Ubuntu系统的root用户有时没有安装,我们可以先输入一个root,他会有一个提示命令,然后我们输入该命令,进行安装,安装完后,使用sudopasswd 命令设置密码,设置完后的密码就是root用 ...

  8. JSP九个内置对象及指令、动作标签

    一.JSP九大内置对象 (一)JSP中无需创建就可以使用的9个对象 输入输出对象 1.response(HttpServletResponse):处理JSP生成的响应,然后将响应结果发送给客户端.是s ...

  9. react项目 路径优化

  10. MongoDB 投影

    mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.例如一个文档有5个字段,只需要显示其中3个 find() 方法 在MongoDB中,当执行find()方法,那么它会显示一个文 ...