Python3 实现进度条

2023-11-11

本文实例讲述了Python显示进度条的方法,是Python程序设计中非常实用的技巧。分享给大家供大家参考。具体方法如下:

首先,进度条和一般的print区别在哪里呢?

答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。

进度条不然,我们必须再原地输出才能保证他是一个进度条,否则换行了怎么还叫进度条?

最简单的办法就是,再输出完毕后,把光标移动到行首,继续在那里输出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果。

可以想到那个转义符了吧,那就是 \r。

转义符\r就可以把光标移动到行首而不换行,转义符\n就把光标移动到行首并且换行。

在python中,输出stdout(标准输出)可以使用sys.stdout.write

1、方法一:

复制代码

import os
import sys
import time   
  
def view_bar(num=1, sum=100, bar_word=":"):   
    rate = float(num) / float(sum)   
    rate_num = int(rate * 100)   
    print '\r%d%% :' %(rate_num),
    for i in range(0, num):   
        os.write(1, bar_word)   
    sys.stdout.flush()   
  
if __name__ == '__main__':   
    for i in range(0, 100):   
        time.sleep(0.1)   
        view_bar(i, 100) 

复制代码

2、方法二:

复制代码

from __future__ import division
 
import sys,time
j = '#'
if __name__ == '__main__':
  for i in range(1,61):
    j += '#'
    sys.stdout.write(str(int((i/60)*100))+'% ||'+j+'->'+"\r")
    sys.stdout.flush()
    time.sleep(0.5)
print

复制代码

 

3、方法三:

用转义符\b
转义符\b是退格键,也就是说把输出的光标往回退格子,这样就可以不用+=了,例如:

复制代码

from __future__ import division
 
import sys,time
if __name__ == '__main__':
  for i in range(1,61):
    sys.stdout.write('#'+'->'+"\b\b")
    sys.stdout.flush()
    time.sleep(0.5)
print

复制代码

光标回退2格,写个#再回退,再写,达到增长的目的了

不过写这么多似乎是废话,在耳边常常听到一句话:那就是不要重复造轮子。实际上python有丰富发lib帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节

 

4、方法四:

下面要介绍的就是这个类“progressbar”(http://code.google.com/p/python-progressbar/),使用easy_install可以方便的安装这个类库,其实就一个文件,拿过来放到文件同一个目录下面也直接可以import过来

复制代码

from __future__ import division
 
import sys,time
from progressbar import *
total = 1000
 
#基本用法
progress = ProgressBar()
for i in progress(range(total)):
 time.sleep(0.01)
 
pbar = ProgressBar().start()
for i in range(1,1000):
  pbar.update(int((i/(total-1))*100))
  time.sleep(0.01)
pbar.finish()
 
#高级用法
widgets = ['Progress: ', Percentage(), ' ', Bar(marker=RotatingMarker('>-=')),
      ' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
for i in range(1000000):
 # do something
 pbar.update(10*i+1)
 time.sleep(0.0001)
pbar.finish()

复制代码

官方示例:http://code.google.com/p/python-progressbar/source/browse/progressbar/examples.py

复制代码

#coding:utf-8
import sys
import time
from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
  FileTransferSpeed, FormatLabel, Percentage, \
  ProgressBar, ReverseBar, RotatingMarker, \
  SimpleProgress, Timer

examples = []
def example(fn):
  try: name = 'Example %d' % int(fn.__name__[7:])
  except: name = fn.__name__

  def wrapped():
    try:
      sys.stdout.write('Running: %s\n' % name)
      fn()
      sys.stdout.write('\n')
    except KeyboardInterrupt:
      sys.stdout.write('\nSkipping example.\n\n')

  examples.append(wrapped)
  return wrapped

@example
def example0():
  pbar = ProgressBar(widgets=[Percentage(), Bar()], maxval=300).start()
  for i in range(300):
    time.sleep(0.01)
    pbar.update(i+1)
  pbar.finish()

@example
def example1():
  widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),
        ' ', ETA(), ' ', FileTransferSpeed()]
  pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
  for i in range(1000000):
    # do something
    pbar.update(10*i+1)
  pbar.finish()

@example
def example2():
  class CrazyFileTransferSpeed(FileTransferSpeed):
    """It's bigger between 45 and 80 percent."""
    def update(self, pbar):
      if 45 < pbar.percentage() < 80:
        return 'Bigger Now ' + FileTransferSpeed.update(self,pbar)
      else:
        return FileTransferSpeed.update(self,pbar)

  widgets = [CrazyFileTransferSpeed(),' <<<', Bar(), '>>> ',
        Percentage(),' ', ETA()]
  pbar = ProgressBar(widgets=widgets, maxval=10000000)
  # maybe do something
  pbar.start()
  for i in range(2000000):
    # do something
    pbar.update(5*i+1)
  pbar.finish()

@example
def example3():
  widgets = [Bar('>'), ' ', ETA(), ' ', ReverseBar('<')]
  pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
  for i in range(1000000):
    # do something
    pbar.update(10*i+1)
  pbar.finish()

@example
def example4():
  widgets = ['Test: ', Percentage(), ' ',
        Bar(marker='0',left='[',right=']'),
        ' ', ETA(), ' ', FileTransferSpeed()]
  pbar = ProgressBar(widgets=widgets, maxval=500)
  pbar.start()
  for i in range(100,500+1,50):
    time.sleep(0.2)
    pbar.update(i)
  pbar.finish()

@example
def example5():
  pbar = ProgressBar(widgets=[SimpleProgress()], maxval=17).start()
  for i in range(17):
    time.sleep(0.2)
    pbar.update(i + 1)
  pbar.finish()

@example
def example6():
  pbar = ProgressBar().start()
  for i in range(100):
    time.sleep(0.01)
    pbar.update(i + 1)
  pbar.finish()

@example
def example7():
  pbar = ProgressBar() # Progressbar can guess maxval automatically.
  for i in pbar(range(80)):
    time.sleep(0.01)

@example
def example8():
  pbar = ProgressBar(maxval=80) # Progressbar can't guess maxval.
  for i in pbar((i for i in range(80))):
    time.sleep(0.01)

@example
def example9():
  pbar = ProgressBar(widgets=['Working: ', AnimatedMarker()])
  for i in pbar((i for i in range(50))):
    time.sleep(.08)

@example
def example10():
  widgets = ['Processed: ', Counter(), ' lines (', Timer(), ')']
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(150))):
    time.sleep(0.1)

@example
def example11():
  widgets = [FormatLabel('Processed: %(value)d lines (in: %(elapsed)s)')]
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(150))):
    time.sleep(0.1)

@example
def example12():
  widgets = ['Balloon: ', AnimatedMarker(markers='.oO@* ')]
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(24))):
    time.sleep(0.3)

@example
def example13():
  # You may need python 3.x to see this correctly
  try:
    widgets = ['Arrows: ', AnimatedMarker(markers='←↖↑↗→↘↓↙')]
    pbar = ProgressBar(widgets=widgets)
    for i in pbar((i for i in range(24))):
      time.sleep(0.3)
  except UnicodeError: sys.stdout.write('Unicode error: skipping example')

@example
def example14():
  # You may need python 3.x to see this correctly
  try:
    widgets = ['Arrows: ', AnimatedMarker(markers='◢◣◤◥')]
    pbar = ProgressBar(widgets=widgets)
    for i in pbar((i for i in range(24))):
      time.sleep(0.3)
  except UnicodeError: sys.stdout.write('Unicode error: skipping example')

@example
def example15():
  # You may need python 3.x to see this correctly
  try:
    widgets = ['Wheels: ', AnimatedMarker(markers='◐◓◑◒')]
    pbar = ProgressBar(widgets=widgets)
    for i in pbar((i for i in range(24))):
      time.sleep(0.3)
  except UnicodeError: sys.stdout.write('Unicode error: skipping example')

@example
def example16():
  widgets = [FormatLabel('Bouncer: value %(value)d - '), BouncingBar()]
  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(180))):
    time.sleep(0.05)

@example
def example17():
  widgets = [FormatLabel('Animated Bouncer: value %(value)d - '),
        BouncingBar(marker=RotatingMarker())]

  pbar = ProgressBar(widgets=widgets)
  for i in pbar((i for i in range(180))):
    time.sleep(0.05)

@example
def example18():
  widgets = [Percentage(),
        ' ', Bar(),
        ' ', ETA(),
        ' ', AdaptiveETA()]
  pbar = ProgressBar(widgets=widgets, maxval=500)
  pbar.start()
  for i in range(500):
    time.sleep(0.01 + (i < 100) * 0.01 + (i > 400) * 0.9)
    pbar.update(i + 1)
  pbar.finish()

@example
def example19():
 pbar = ProgressBar()
 for i in pbar([]):
  pass
 pbar.finish()

try:
  for example in examples:
    example()
except KeyboardInterrupt:
  sys.stdout('\nQuitting examples.\n')

复制代码

 

1

Progress Bar 使用例子

再发一个类:

复制代码

class progressbarClass: 
  def __init__(self, finalcount, progresschar=None):
    import sys
    self.finalcount=finalcount
    self.blockcount=0
    #
    # See if caller passed me a character to use on the
    # progress bar (like "*"). If not use the block
    # character that makes it look like a real progress
    # bar.
    #
    if not progresschar: self.block=chr(178)
    else:        self.block=progresschar
    #
    # Get pointer to sys.stdout so I can use the write/flush
    # methods to display the progress bar.
    #
    self.f=sys.stdout
    #
    # If the final count is zero, don't start the progress gauge
    #
    if not self.finalcount : return
    self.f.write('\n------------------- % Progress -------------------\n')
    return
 
  def progress(self, count):
    #
    # Make sure I don't try to go off the end (e.g. >100%)
    #
    count=min(count, self.finalcount)
    #
    # If finalcount is zero, I'm done
    #
    if self.finalcount:
      percentcomplete=int(round(100*count/self.finalcount))
      if percentcomplete < 1: percentcomplete=1
    else:
      percentcomplete=100
      
    #print "percentcomplete=",percentcomplete
    blockcount=int(percentcomplete/2)
    #print "blockcount=",blockcount
    if blockcount > self.blockcount:
      for i in range(self.blockcount,blockcount):
        self.f.write(self.block)
        self.f.flush()
        
    if percentcomplete == 100: self.f.write("\n")
    self.blockcount=blockcount
    return
  
if __name__ == "__main__":
  from time import sleep
  pb=progressbarClass(8,"*")
  count=0
  while count<9:
    count+=1
    pb.progress(count)
    sleep(0.2)

另外,python cookbook中11.1节也提供了一个不错的进度条类,代码如下:

import sys
class progressbar(object):
  def __init__(self, finalcount, block_char='.'):
    self.finalcount = finalcount
    self.blockcount = 0
    self.block = block_char
    self.f = sys.stdout
    if not self.finalcount: return
    self.f.write('\n------------------ % Progress -------------------1\n')
    self.f.write('  1  2  3  4  5  6  7  8  9  0\n')
    self.f.write('----0----0----0----0----0----0----0----0----0----0\n')
  def progress(self, count):
    count = min(count, self.finalcount)
    if self.finalcount:
      percentcomplete = int(round(100.0*count/self.finalcount))
      if percentcomplete < 1: percentcomplete = 1
    else:
      percentcomplete=100
    blockcount = int(percentcomplete//2)
    if blockcount <= self.blockcount:
      return
    for i in range(self.blockcount, blockcount):
      self.f.write(self.block)
    self.f.flush()
    self.blockcount = blockcount
    if percentcomplete == 100:
      self.f.write("\n")

if __name__ == "__main__":
  from time import sleep
  pb = progressbar(8, "*")
  for count in range(1, 9):
    pb.progress(count)
    sleep(0.2)
  pb = progressbar(100)
  pb.progress(20)
  sleep(0.3)
  pb.progress(47)
  sleep(0.3)
  pb.progress(90)
  sleep(0.3)
  pb.progress(100)
  print "testing 1:"
  pb = progressbar(1)
  pb.progress(1)

复制代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 实现进度条 的相关文章

随机推荐

  • 华为swot分析2020_2020年全球与中国人工智能与分析系统行业现状及未来5年市场预测分析报告...

    本文研究全球及中国市场人工智能与分析系统现状及未来发展趋势 侧重分析全球及中国市场的主要企业 同时对比北美 欧洲 日本 中国 东南亚 印度等地区的现状及未来发展趋势 2019年全球人工智能与分析系统市场规模达到了xx亿元 预计2026年将达
  • springboot添加验证码功能

    开源验证码 1 Happy Captcha 提供了图片和动画两种展现形式 验证码内容包括中文 数字 09 中文数字 零至九 中文大写数字 零至玖 数字与字母混合 09 az AZ 数字与小写字母混合 09 az 数字与大写字母混合 09 A
  • Clang 中 AST 相关类简介(不定时更新)

    Clang 中 AST 相关类简介 不定时更新 1 Decl declaration 1 1 FunctionDecl 2 Stmt statement 3 Expr expression 3 1 FullExpr 3 2 ExprWith
  • 【Grub2】BIOS添加Grub2引导(Windows下操作)

    电脑上安装的系统是Windows10 BIOS MBR 想利用Grub2安装CentOS 和RemixOS三个操作系统 为了实现硬盘安装CentOS 需要用到Grub2 第一步 Grub2下载 文件准备到Grub2官网ftp ftp gnu
  • C语言库函数— qsort () 详解

    目录 1 qsort 函数简介 1 1 函数原型 1 2 函数参数 2 比较函数简介 2 1 比较函数参数 2 2 比较函数使用 3 qsort 函数使用 3 1 整形数组排序 3 2 字符数组排序 3 3 浮点型数组排序 double类型
  • 降压式变换电路(Buck电路)详解

    降压式变换电路 Buck电路 详解 一 BUCK电路基本结构 开关导通时等效电路 开关关断时等效电路 二 等效的电路模型及基本规律 1 从电路可以看出 电感L和电容C组成低通滤波器 此滤 波器设计 的原则是使 us t 的直流分量可以通过
  • 计算机英语第三版司爱华,論计算机英语的特征.doc

    論计算机英语的特征 毕业设计 论文 题目 论计算机英语的特征 形式 层次 专科 专业 经贸英语 班号 学号 学生姓名 指导教师 年 月 日 摘 要 计算机英语是英语的一个分支 属于专业英语的范畴 所以有其自己的特征本文主要从计算机英语的词汇
  • 第2天:基础入门-数据包拓展

    前言 如有不妥之处 还望指正 目录 前言 1 网站解析对应 2 HTTP HTTPS数据包 2 1 HTTP 与 HTTPS 区别 2 2 HTTP简要通信过程 2 3 HTTPS简要通信过程 2 4 Request请求数据包数据格式 2
  • AI真的快让我失业了

    以下文章来源于深燃 作者深燃团队 编辑 深燃 聚焦创新经济 专注深度内容 来源 深燃 ID shenrancaijing 作者 邹帅 李秋涵 王敏 唐亚华 王璐 编辑 李秋涵 本文已获授权 跟AI有关的新闻 一个接着一个 前一天你还和往常一
  • 光纤收发器的六个指示灯代表是什么意思?

    对光纤收发器这块了解的朋友应该知道 光纤收发器有6个LED指示灯 它们分别显示了收发器的工作状态 根据LED所示 我们就能判断出收发器是否工作正常和可能有什么问题 从而能帮助找出故障 那么 光纤收发器的六个指示灯分别代表什么意思 有哪些作用
  • 刷题_day2:双指针法

    题目介绍 给你一个数组 nums 和一个值 val 你需要 原地 移除所有数值等于 val 的元素 并返回移除后数组的新长度 可以使用暴力解法 嵌套两个for循环 但是时间复杂度为O n2 双指针法 快慢指针 可以利用两个指针 在一次for
  • Spring Boot自动装配原理(易懂)

    Spring Boot的自动装配原理 易懂 熟练使用Spring Boot那么自动装配原理的掌握是必不可少的 文章目录 Spring Boot的自动装配原理 易懂 一 自动装配是什么 二 启动类注解流程关系分析 1 首先展示 SpringB
  • R语言中如何给向量改变赋值

    R语言中如何给向量改变赋值 一 创建向量 二 访问向量特定位置 三 改变向量特定位置赋值 结果 一 创建向量 a lt c rep 冬季盛宴 5 rep 盛宴 6 二 访问向量特定位置 代码如下 示例 在这里插入代码片 a 4 三 改变向量
  • ln: 创建符号链接 "/usr/bin/java": 文件已存在

    执行下述命令创建软链接 ln s JAVA HOME bin java usr bin java 出现下述错误提示 ln 创建符号链接 usr bin java 文件已存在 这种情况可以通过命令ll检查下 usr bin java现有的软链
  • Shell 批量搜索关键词并保存结果到文件中(数组、循环)

    bin bash keywords 不需要 不用谢谢 xxx xxx for var in keywords do echo var cat corpus txt grep var wc l cat corpus txt grep var
  • 微信支付V3 生成平台证书

    微信支付V3里必须有平台证书文件 才能唤起唤醒支付 平台证书生成前提需要提前下载好设置apikey3后下载的证书3个证书文件 apiclient key pem apiclient cert pem apiclient cert p12 官
  • C++ 栈和队列

    前言 前几次我们学习了vector list 分别对应线性表和链表 这两个基础的数据结构 本篇 我们将基于前面知识的基础 学习线性表和链表的应用结构 栈和队列 文章目录 前言 一 栈 1 概要 2 适配器 配接器模式 3 栈的使用 4 模拟
  • 富文本编辑器提取纯文本(uniapp、vue没有简介用详情替代)

    1 js方法 filtersText val if val null val let reg u4e00 u9fa5 g let names val match reg val names names join return val els
  • 以太坊之Downloader同步区块流程

    随着以太坊的数据越来越多 同步也越来越慢 使用full sync mode同步的话恐怕得一两个礼拜也不见得能同步完 以太坊有fast sync mode 找了些文章还不是很明白具体内容 所以尝试着看懂写下来 如有错误之处欢迎指正 关于fas
  • Python3 实现进度条

    本文实例讲述了Python显示进度条的方法 是Python程序设计中非常实用的技巧 分享给大家供大家参考 具体方法如下 首先 进度条和一般的print区别在哪里呢 答案就是print会输出一个 n 也就是换行符 这样光标移动到了下一行行首