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中带_的变量或函数命名
Dec 04 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
Python使用random模块生成随机数操作实例详解
Sep 17 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
python中p-value的实现方式
Dec 16 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
用Python自动清理系统垃圾的实现
Jan 18 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Python Pandas解析读写 CSV 文件
宝塔更新Python及Flask项目的部署
python模板入门教程之flask Jinja
使用Python解决图表与画布的间距问题
Python的property属性详细讲解
Apr 11 #Python
OpenCV项目实践之停车场车位实时检测
You might like
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
Oracle Faq(Oracle的版本)
2006/10/09 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
Js 获取HTML DOM节点元素的方法小结
2009/04/24 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
用js实现放大镜效果
2020/10/28 Javascript
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
python3之微信文章爬虫实例讲解
2017/07/12 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
python文件读写代码实例
2019/10/21 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
骨干教师培训感言
2014/01/16 职场文书
九年级物理教学反思
2014/01/29 职场文书
机械系毕业生求职信
2014/05/28 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
婚庆司仪开场白
2015/05/29 职场文书
初中团委工作总结
2015/08/13 职场文书
解除合同协议书范本
2016/03/21 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis