search
HomeBackend DevelopmentPython TutorialPython实现控制台进度条功能

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

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

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

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

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

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

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

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

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
Usage:
Just A Template
"""
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

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

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
Usage:
Just A Template
"""
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帮你实现这个东西,你完全可以把心思放在逻辑开发上而不用注意这些小细节

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

如下图所示:

下面就是基本使用举例:

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2

"""
Usage:
Just A Template
"""
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

Python

# 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<a href="http://www.jobbole.com/members/weiboyes8848">@*</a> ')]
  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='&#9680;&#9683;&#9681;&#9682;')]
    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')

再发一个类:

Python

#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
"""
Usage:
Just A Template
"""
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节也提供了一个不错的进度条类,代码如下:

Python

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)

运行结果如下图所示:

希望本文所述对大家Python程序设计的学习有所帮助。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software