查看原文
其他

三行代码创建一个进度条,真香!

IT服务圈儿 2023-02-06

The following article is from 麦叔编程 Author 小K

来源丨经授权转自 麦叔编程(ID:maishucode)

作者丨小K

以前写代码的时候,希望把在运行的时候多print出一些提示性信息,感觉满屏显示debug的信息特别炫酷,大家有没有跟我一样的感受?

但是渐渐从“菜鸟”变成“老狗”,堆代码的经验上去后,对这种炫酷的界面却有点反感起来了。

现在已经懒得从一堆debug信息中拔取对自己有用的信息了。

以前跑代码,日志只用debug的信息都会存入,然而现在连warning都懒得看了。

我以前的代码风格

这是以前我写的爬ppt的脚本:

请求url得到200的响应码之后,会显示输出一次开始下载 XXX。

在with open实现存储之后,再显示输出一次XXX 下载结束!

一个文件爬取会输出两次信息,脚本运行之后也会有那种“炫酷”的感觉~

如果代码运行有错误,当然显示更多信息,会对排bug有更大的帮助,但是老是这么输出显示,就有点冗余了。

「对于一些跑量的脚本,把提示信息,换成进度条就香了。」

代码重构

重构前,先介绍下今天要用到的库progress

安装

pip install progressbar2

py2 使用pip install progressbar安装

使用

progress库中,只用到它的「三个实例方法」,就可实现一个进度条的动作:

start(max_value=None, init=True):Starts measuring time, and prints the bar at 0%。

update(value=None, force=False, **kwargs): Updates the ProgressBar to a new value。

finish(end='\n') :Puts the ProgressBar bar in the finished state

「start」 进度条初始化,给它一个目标上限值,例如到100%结束,max_value参数给个100就OK了。

「update」 更新进度条进度,这个方法执行一次,进度条就会更新一次,value参数就是要更新的值。

「finish」 关闭进度条,不想再对进度条进行操作,执行它。

代码实例

import time
import progressbar
 
p = progressbar.ProgressBar() # 实例化进度条
max_value = 100     # 满值100
p.start(max_value)

init_num = 0
n = 0
update_value = 1

while n < 100:
    p.update(n)     # 更新
    n += update_value
    time.sleep(0.1)

p.finish()

上面的代码,会执行10秒,每秒累加10次1:

执行结果:

100% (100 of 100) |######################################################################################| Elapsed Time: 0:00:10 Time:  0:00:10

当然,这边显示的是已经运行完成的,实际效果这个进度条是动态增加的。

知道用法之后,把这个套路套进我原先的爬虫代码中:

(截取主要代码)

def run():
    p = progressbar.ProgressBar()
    links_num =  len(get_detail_link(index_url))
    p.start(links_num)
    for num, link in enumerate(get_detail_link(index_url)):
        download_document(link)
        p.update(num)
    p.finish()

if __name__ == '__main__':
    run()

运行脚本后:

假如代码finish关闭进度条实例,达到100%后会自动退出。 棒!我非常喜欢这样的方式显示。

定制化进度条

如果你觉得这样的显示有点怪,那就定制化它:

修改widget参数,并传入progressbar.ProgressBar()


    widgets = [ 'Progress Name :',' [', progressbar.Timer(), '] ',progressbar.Bar('+'), ' (', progressbar.ETA(), ') ']
    p = progressbar.ProgressBar(widgets=widgets)

Bar('+') : 调用进度条步进框,并以‘+’符号显示;

Timer() :已用时间;

ETA() : 预计剩余时间;

Percentage() :进度百分比;


1、Chrome 发布新的 CSS 视口单位:svh、lvh、dvh!!!

2、Nacos 2.2 正式发布,这次更新太炸了!

3、JavaScript 中的依赖注入

4、聊聊Linux中线程和进程的联系与区别!

5、让人恶心的多线程代码,性能怎么优化!

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存