详细介绍Python进度条tqdm的使用


Posted in Python onJuly 31, 2019

前言

有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况。这对于第三方库非常丰富的Python来说,想要实现这一功能并不是什么难事。

tqdm就能非常完美的支持和解决这些问题,可以实时输出处理进度而且占用的CPU资源非常少,支持windowsLinuxmac等系统,支持循环处理多进程递归处理、还可以结合linux的命令来查看处理情况,等进度展示。

大家先看看tqdm的进度条效果

详细介绍Python进度条tqdm的使用

安装

github地址:https://github.com/tqdm/tqdm

想要安装tqdm也是非常简单的,通过pip或conda就可以安装,而且不需要安装其他的依赖库

pip安装

pip install tqdm

conda安装

conda install -c conda-forge tqdm

迭代对象处理

对于可以迭代的对象都可以使用下面这种方式,来实现可视化进度,非常方便

from tqdm import tqdm
import time

for i in tqdm(range(100)):
  time.sleep(0.1)
  pass

详细介绍Python进度条tqdm的使用

在使用tqdm的时候,可以将tqdm(range(100))替换为trange(100)代码如下

from tqdm import tqdm,trange
import time

for i in trange(100):
  time.sleep(0.1)
  pass

观察处理的数据

通过tqdm提供的set_description方法可以实时查看每次处理的数据

from tqdm import tqdm
import time

pbar = tqdm(["a","b","c","d"])
for c in pbar:
  time.sleep(1)
  pbar.set_description("Processing %s"%c)

详细介绍Python进度条tqdm的使用

手动设置处理的进度

通过update方法可以控制每次进度条更新的进度

from tqdm import tqdm
import time

#total参数设置进度条的总长度
with tqdm(total=100) as pbar:
  for i in range(100):
    time.sleep(0.05)
    #每次更新进度条的长度
    pbar.update(1)

详细介绍Python进度条tqdm的使用

除了使用with之外,还可以使用另外一种方法实现上面的效果

from tqdm import tqdm
import time

#total参数设置进度条的总长度
pbar = tqdm(total=100)
for i in range(100):
  time.sleep(0.05)
  #每次更新进度条的长度
  pbar.update(1)
#关闭占用的资源
pbar.close()

linux命令展示进度条

不使用tqdm

$ time find . -name '*.py' -type f -exec cat \{} \; | wc -l
857365

real  0m3.458s
user  0m0.274s
sys   0m3.325s

使用tqdm

$ time find . -name '*.py' -type f -exec cat \{} \; | tqdm | wc -l
857366it [00:03, 246471.31it/s]
857365

real  0m3.585s
user  0m0.862s
sys   0m3.358s

指定tqdm的参数控制进度条

$ find . -name '*.py' -type f -exec cat \{} \; |
  tqdm --unit loc --unit_scale --total 857366 >> /dev/null
100%|???????????????????????????????????| 857K/857K [00:04<00:00, 246Kloc/s]
$ 7z a -bd -r backup.7z docs/ | grep Compressing |
  tqdm --total $(find docs/ -type f | wc -l) --unit files >> backup.log
100%|????????????????????????????????| 8014/8014 [01:37<00:00, 82.29files/s]

自定义进度条显示信息

通过set_descriptionset_postfix方法设置进度条显示信息

from tqdm import trange
from random import random,randint
import time

with trange(100) as t:
  for i in t:
    #设置进度条左边显示的信息
    t.set_description("GEN %i"%i)
    #设置进度条右边显示的信息
    t.set_postfix(loss=random(),gen=randint(1,999),str="h",lst=[1,2])
    time.sleep(0.1)

详细介绍Python进度条tqdm的使用

from tqdm import tqdm
import time

with tqdm(total=10,bar_format="{postfix[0]}{postfix[1][value]:>9.3g}",
     postfix=["Batch",dict(value=0)]) as t:
  for i in range(10):
    time.sleep(0.05)
    t.postfix[1]["value"] = i / 2
    t.update()

详细介绍Python进度条tqdm的使用

多层循环进度条

通过tqdm也可以很简单的实现嵌套循环进度条的展示

from tqdm import tqdm
import time

for i in tqdm(range(20), ascii=True,desc="1st loop"):
  for j in tqdm(range(10), ascii=True,desc="2nd loop"):
    time.sleep(0.01)

详细介绍Python进度条tqdm的使用

pycharm中执行以上代码的时候,会出现进度条位置错乱,目前官方并没有给出好的解决方案,这是由于pycharm不支持某些字符导致的,不过可以将上面的代码保存为脚本然后在命令行中执行,效果如下

详细介绍Python进度条tqdm的使用

多进程进度条

在使用多进程处理任务的时候,通过tqdm可以实时查看每一个进程任务的处理情况

from time import sleep
from tqdm import trange, tqdm
from multiprocessing import Pool, freeze_support, RLock

L = list(range(9))

def progresser(n):
  interval = 0.001 / (n + 2)
  total = 5000
  text = "#{}, est. {:<04.2}s".format(n, interval * total)
  for i in trange(total, desc=text, position=n,ascii=True):
    sleep(interval)

if __name__ == '__main__':
  freeze_support() # for Windows support
  p = Pool(len(L),
       # again, for Windows support
       initializer=tqdm.set_lock, initargs=(RLock(),))
  p.map(progresser, L)
  print("\n" * (len(L) - 2))

详细介绍Python进度条tqdm的使用

pandas中使用tqdm

import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))


tqdm.pandas(desc="my bar!")
df.progress_apply(lambda x: x**2)

详细介绍Python进度条tqdm的使用

递归使用进度条

from tqdm import tqdm
import os.path

def find_files_recursively(path, show_progress=True):
  files = []
  # total=1 assumes `path` is a file
  t = tqdm(total=1, unit="file", disable=not show_progress)
  if not os.path.exists(path):
    raise IOError("Cannot find:" + path)

  def append_found_file(f):
    files.append(f)
    t.update()

  def list_found_dir(path):
    """returns os.listdir(path) assuming os.path.isdir(path)"""
    try:
      listing = os.listdir(path)
    except:
      return []
    # subtract 1 since a "file" we found was actually this directory
    t.total += len(listing) - 1
    # fancy way to give info without forcing a refresh
    t.set_postfix(dir=path[-10:], refresh=False)
    t.update(0) # may trigger a refresh
    return listing

  def recursively_search(path):
    if os.path.isdir(path):
      for f in list_found_dir(path):
        recursively_search(os.path.join(path, f))
    else:
      append_found_file(path)

  recursively_search(path)
  t.set_postfix(dir=path)
  t.close()
  return files

find_files_recursively("E:/")

详细介绍Python进度条tqdm的使用

注意

在使用tqdm显示进度条的时候,如果代码中存在print可能会导致输出多行进度条,此时可以将print语句改为tqdm.write,代码如下

for i in tqdm(range(10),ascii=True):
  tqdm.write("come on")
  time.sleep(0.1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python random模块(获取随机数)常用方法和使用例子
May 13 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
python实现百度语音识别api
Apr 10 Python
解决pycharm界面不能显示中文的问题
May 23 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
Python2.7实现多进程下开发多线程示例
May 31 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 #Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 #Python
django解决订单并发问题【推荐】
Jul 31 #Python
python opencv将图片转为灰度图的方法示例
Jul 31 #Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 #Python
Python对接六大主流数据库(只需三步)
Jul 31 #Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 #Python
You might like
PHP生成便于打印的网页
2006/10/09 PHP
php 正则匹配函数体
2009/08/25 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
JS不完全国际化&amp;本地化手册 之 理论篇
2016/09/27 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
python 把列表转化为字符串的方法
2018/10/23 Python
python通过链接抓取网站详解
2019/11/20 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
使用Python pip怎么升级pip
2020/08/11 Python
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
班主任工作实习计划
2015/01/16 职场文书