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自动翻译实现方法
May 28 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
python数据结构之链表的实例讲解
Jul 25 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
Python常用字符串替换函数strip、replace及sub用法示例
May 21 Python
Python装饰器基础概念与用法详解
Dec 22 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
用Python实现BP神经网络(附代码)
Jul 10 Python
在python中利用try..except来代替if..else的用法
Dec 19 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
Python+Appium实现自动化清理微信僵尸好友的方法
Feb 04 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全排列递归算法代码
2012/10/09 PHP
为你总结一些php信息函数
2015/10/21 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
php curl发送请求实例方法
2019/08/01 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
python fabric实现远程部署
2017/01/05 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
python适合做数据挖掘吗
2020/06/16 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
求职信格式范本
2013/11/15 职场文书
给实习单位的感谢信
2014/02/01 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
小学英语课教学反思
2016/02/15 职场文书