Python几种酷炫的进度条的方式


Posted in Python onApril 11, 2022

前言:

在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度条可以便捷的观察任务处理情况。

除了使用 print 来打印之外,今天本文我来给大家介绍几种酷炫的进度条的方式。

Python几种酷炫的进度条的方式

1、自定义ProgressBar

最原始的办法就是不借助任何第三方工具,自己写一个进度条函数,使用time模块配合sys模块即可

import sys
import time

def progressbar(it, prefix="", size=60, file=sys.stdout):
    count = len(it)
    def show(j):
        x = int(size*j/count)
        file.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), j, count))
        file.flush()        
    show(0)
    for i, item in enumerate(it):
        yield item
        show(i+1)
    file.write("\n")
    file.flush()

    
for i in progressbar(range(15), "Computing: ", 40):
    do_something()
    time.sleep(0.1)

Python几种酷炫的进度条的方式

自己定义的好处就是可以将进度条定义成我们想要的形式比如上面就是使用#与·来输出,为什么不用print?因为sys.stdout就是print的一种默认输出格式,而sys.stdout.write()可以不换行打印,sys.stdout.flush()可以立即刷新输出的内容。当然也可以封装成类来更好的使用,但效果是类似的。

from __future__ import print_function
import sys
import re


class ProgressBar(object):
    DEFAULT = 'Progress: %(bar)s %(percent)3d%%'
    FULL = '%(bar)s %(current)d/%(total)d (%(percent)3d%%) %(remaining)d to go'

    def __init__(self, total, width=40, fmt=DEFAULT, symbol='=',
                 output=sys.stderr):
        assert len(symbol) == 1

        self.total = total
        self.width = width
        self.symbol = symbol
        self.output = output
        self.fmt = re.sub(r'(?P<name>%\(.+?\))d',
            r'\g<name>%dd' % len(str(total)), fmt)

        self.current = 0

    def __call__(self):
        percent = self.current / float(self.total)
        size = int(self.width * percent)
        remaining = self.total - self.current
        bar = '[' + self.symbol * size + ' ' * (self.width - size) + ']'

        args = {
            'total': self.total,
            'bar': bar,
            'current': self.current,
            'percent': percent * 100,
            'remaining': remaining
        }
        print('\r' + self.fmt % args, file=self.output, end='')

    def done(self):
        self.current = self.total
        self()
        print('', file=self.output)
        
from time import sleep

progress = ProgressBar(80, fmt=ProgressBar.FULL)

for x in range(progress.total):
    progress.current += 1
    progress()
    sleep(0.1)
progress.done()

Python几种酷炫的进度条的方式

2、tqdm

之前我们说了,自定义的好处就是可以自己修改,那么使用第三方库的好处就是可以偷懒,不用自己写,拿来就能用。比如提到Python进度条那肯定会想到常用的tqdm,安装很简单pip install tqdm即可,使用也很简单,几行代码即可实现上面的进度条

from tqdm import trange
import time
for i in trange(10): 
    time.sleep(1)

Python几种酷炫的进度条的方式

当然tqdm作为老牌的Python进度条工具,循环处理、多进程、多线程、递归处理等都是支持的,你可以在官方GitHub上学习 、解锁更多的玩法。

3、Rich

上面两种实现Python进度条的方法都学会了吗,虽然简单但是看上去并不漂亮,颜色也比较单调。所以最后压轴出场的就是一款比较小众的第三方库Rich 。Rich主要是用于在终端中打印丰富多彩的文本(最高支持1670万色)

Python几种酷炫的进度条的方式

所以当然可以使用Rich打印进度条,显示完成百分比,剩余时间,数据传输速度等都可以。并且样式更加酷炫,并且它是高度可配置的,因此我们可以对其进行自定义以显示所需的任何信息。使用也很简单,比如我们使用Rich来实现一个最简单的进度条

from rich.progress import track
import  time

for step in track(range(30)):
    time.sleep(0.5)

Python几种酷炫的进度条的方式

同时Rich支持多个进度条,这在多任务情况下监控的进度很有用

Python几种酷炫的进度条的方式

Python 相关文章推荐
python翻译软件实现代码(使用google api完成)
Nov 26 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
python将图片转base64,实现前端显示
Jan 09 Python
Python中join()函数多种操作代码实例
Jan 13 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
Python实现简单的2048小游戏
Mar 01 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
You might like
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
JavaScript 事件对象的实现
2009/07/13 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
Javascript事件实例详解
2013/11/06 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
JavaScript中的闭包(Closure)详细介绍
2014/12/30 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python判断输入日期为第几天的实例
2018/11/13 Python
使用python绘制温度变化雷达图
2019/10/18 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
Python 实现集合Set的示例
2020/12/21 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
上班迟到检讨书
2014/01/10 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
光荣之路观后感
2015/06/12 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电