本文转载自微信公众号《Python技术》,作者:佩森酱。转载本文请联系Python技术公众号。作为程序员,我们经常会遇到耗时的操作。这时候,我们大多数人都会眼巴巴地等待程序完成。有些人会趁机摸鱼,打发这段无聊又看似不为人知的时光,我就是这样做的。不过,我们也可以选择另一种方式——用一个很酷的进度条来观察处理的进度,同时我们也可以随时了解程序的运行状态,从而知道发生了什么。今天给大家介绍一个Python的库——tqdm,它可以完美的支持和解决这些问题。可实时输出加工进度,占用CPU资源极少。支持windows、linux、mac等系统,支持循环处理,多进程,递归处理,也可以结合linux命令查看处理状态,等进度显示。安装我们常用的安装方式是直接pip安装:pipinstalltqdm但是我这样安装的时候报错:报错信息是说这个pypi.org不是受信任的网站,所以我加了:pipinstalltqdm--trusted-hostpypi.org的结果还是这个错误。这就有点无语了。然后我尝试使用豆瓣的源安装:pipinstall-ihttps://pypi.douban.com/simpletqdm还是报同样的错误。但是我的浏览器访问这个网站没有问题:https://pypi.org/project/tqdm/这样的话,我就下载文件安装。下载后我把whl文件放在我的工程目录下,然后使用命令行安装:pipinstall--trusted-hostpypi.orgtqdm-4.62.3-py2.py3-none-any.whl这次安装没有报错。我将使用命令检查是否安装成功:pipshowtqdm命令行成功显示信息:Name:tqdmVersion:4.62.3Summary:Fast,ExtensibleProgressMeterHome-page:https://tqdm.github.ioAuthor:NoneAuthor-email:NoneLicense:MPLv2.0,MITLicencesLocation:c:\pworkspace\mypy\venv\lib\site-packagesRequires:coloramaRequired-by:折腾了半天终于安装成功!使用示例本文中的示例都是在jupyternotebook环境下运行的,在不同的环境下运行效果会有所不同。我们进入tqdm的源码,找到__init__方法:def__init__(self,iterable=None,desc=None,total=None,leave=True,file=None,ncols=None,mininterval=0.1,maxinterval=10.0,miniters=无,ascii=无,disable=False,unit='it',unit_scale=False,dynamic_ncols=False,smoothing=0.3,bar_format=None,initial=0,position=None,postfix=None,unit_divisor=1000,write_bytes=None,lock_args=None,nrows=None,colour=None,delay=0,gui=False,**kwargs):我们可以看到tqdm支持的参数很多,下面列出一些常用的参数:iterable:iterableobject,does手动更新时不需要设置。desc:string,左侧进度条的描述文字。total:项目总数。leave:布尔值,迭代完成后是否保留进度条。file:输出指向的位置,默认是终端,一般不需要设置。ncols:调整进度条的宽度。默认是根据环境自动调整长度。如果设置为0,则没有进度条,只输出信息。unit:描述处理项的文字,默认为'it',例如:100it/s,如果设置为'img'处理照片,则为100img/s。unit_scale:根据国际标准自动转换项目处理速度单位,如100000it/s>>100kit/s。基于可迭代对象,直接使用可迭代对象作为参数。我们来看一个例子:fromtqdmimporttqdmfromtimeimportsleepforcharintqdm(['h','e','l','l','o']):sleep(0.25)foriintqdm(range(100)实现的进度条效果)):sleep(0.05)如下:tqdm(range())也可以用tqdm提供的trange()代替,可以简化代码。fromtqdm.notebookimporttrangeforiintrange(100):sleep(0.05)实现进度条效果如下:我们还可以为进度条添加说明:pbar=tqdm(range(5))forcharinpbar:pbar.set_description("Progress%d"%char)sleep(1)实现的进度条效果如下:接下来我要改变进度条的颜色:手动控制进度条我们可以使用with语句来手动控制进度条。withtqdm(total=100)aspbar:foriinrange(1,5):sleep(1)#Updateprogresspbar.update(10*i)这里我设置了进度条的更新间隔,total设置为total=100,并且然后分成四次,让进度条每隔10%、20%、30%、40%更新一次。进度条效果如下:接下来我要改变进度条的颜色:withtqdm(total=100,colour='yellow')aspbar:foriinrange(1,5):sleep(1)#updateprogresspbar.update(10*i)我把进度条改成了黄色。接下来,让我们玩一个嵌套的进度条。foriintrange(3,desc='outerloop'):foriintrange(100,desc='innerloop',leave=False):sleep(0.01)这里我用了两层for循环实现嵌套,并设置了内层的参数leavelayer如果为False,则表示每次执行时内部进度条都会消失。看一下最终的运行效果:总结一下这个进度条库的使用是不是很简单?几行代码可以为我们的程序增加很多。行不如心,赶快用起来吧!
