python的Tqdm模块的使用


Posted in Python onJanuary 10, 2018

Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)。

我的系统是window环境,首先安装python,接下来就是pip。

pip安装:

在python根目录下创建一个get-pip.py的文件,内容:

https://bootstrap.pypa.io/get-pip.py 

然后在CMD窗口进入python下面:

输出:

python -m pip install -U pip

由于Tqdm要求的pip版本是9.0所以需要手动安装pip9.0
http://pypi.python.org/pypi/pip

下载安装包9.0

然后解压进入,CMD窗口输入:python setup.py install

然后就可以安装Tqdm了,

pip install tqdm

安装最新的开发版的话

pip install -e git+https://github.com/tqdm/tqdm.git@master#egg=tqdm

最后看看怎么用呢?https://pypi.python.org/pypi/tqdm

基本用法:

from tqdm import tqdm 
for i in tqdm(range(10000)): 
   sleep(0.01)

当然除了tqdm,还有trange,使用方式完全相同

for i in trange(100): 
    sleep(0.1)

只要传入list都可以:

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

也可以手动控制更新

with tqdm(total=100) as pbar: 
  for i in range(10): 
    pbar.update(10)

也可以这样:

pbar = tqdm(total=100) 
for i in range(10): 
  pbar.update(10) 
pbar.close()

在Shell的tqdm用法

统计所有python脚本的行数:

$ time find . -name '*.py' -exec cat \{} \; | wc -l 
857365 
 
real  0m3.458s 
user  0m0.274s 
sys   0m3.325s 
 
$ time find . -name '*.py' -exec cat \{} \; | tqdm | wc -l 
857366it [00:03, 246471.31it/s] 
857365 
 
real  0m3.585s 
user  0m0.862s 
sys   0m3.358s

使用参数:

$ find . -name '*.py' -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]

通过看示范的代码,我们能发现使用的核心是tqdm和trange这两个函数,从代码层面分析tqdm的功能,那首先是init.py

__all__ = ['tqdm', 'tqdm_gui', 'trange', 'tgrange', 'tqdm_pandas', 
      'tqdm_notebook', 'tnrange', 'main', 'TqdmKeyError', 'TqdmTypeError', 
      '__version__']

跟踪到_tqdm.py,能看到tqdm类的声明,首先是初始化

def __init__(self, iterable=None, desc=None, total=None, leave=True, 
         file=sys.stderr, ncols=None, mininterval=0.1, 
         maxinterval=10.0, miniters=None, ascii=None, disable=False, 
         unit='it', unit_scale=False, dynamic_ncols=False, 
         smoothing=0.3, bar_format=None, initial=0, position=None, 
         gui=False, **kwargs):
Parameters 
 
iterable : iterable, optional 
Iterable to decorate with a progressbar. 
可迭代的进度条。 
Leave blank to manually manage the updates. 
留空手动管理更新?? 
desc : str, optional 
Prefix for the progressbar. 
进度条的描述 
total : int, optional 
The number of expected iterations. If unspecified, 
len(iterable) is used if possible. As a last resort, only basic 
progress statistics are displayed (no ETA, no progressbar). 
If gui is True and this parameter needs subsequent updating, 
specify an initial arbitrary large positive integer, 
e.g. int(9e9). 
预期的迭代数目,默认为None,则尽可能的迭代下去,如果gui设置为True,这里则需要后续的更新,将需要指定为一个初始随意值较大的正整数,例如int(9e9) 
leave : bool, optional 
If [default: True], keeps all traces of the progressbar 
upon termination of iteration. 
保留进度条存在的痕迹,简单来说就是会把进度条的最终形态保留下来,默认为True 
file : io.TextIOWrapper or io.StringIO, optional 
Specifies where to output the progress messages 
[default: sys.stderr]. Uses file.write(str) and file.flush() 
methods. 
指定消息的输出 
ncols : int, optional 
The width of the entire output message. If specified, 
dynamically resizes the progressbar to stay within this bound. 
If unspecified, attempts to use environment width. The 
fallback is a meter width of 10 and no limit for the counter and 
statistics. If 0, will not print any meter (only stats). 
整个输出消息的宽度。如果指定,动态调整的进度停留在这个边界。如果未指定,尝试使用环境的宽度。如果为0,将不打印任何东西(只统计)。 
mininterval : float, optional 
Minimum progress update interval, in seconds [default: 0.1]. 
最小进度更新间隔,以秒为单位(默认值:0.1)。 
maxinterval : float, optional 
Maximum progress update interval, in seconds [default: 10.0]. 
最大进度更新间隔,以秒为单位(默认值:10)。 
miniters : int, optional 
Minimum progress update interval, in iterations. 
If specified, will set mininterval to 0. 
最小进度更新周期 
ascii : bool, optional 
If unspecified or False, use unicode (smooth blocks) to fill 
the meter. The fallback is to use ASCII characters 1-9 #. 
如果不设置,默认为unicode编码 
disable : bool, optional 
Whether to disable the entire progressbar wrapper 
[default: False]. 
是否禁用整个进度条包装(如果为True,进度条不显示) 
unit : str, optional 
String that will be used to define the unit of each iteration 
[default: it]. 
将被用来定义每个单元的字符串??? 
unit_scale : bool, optional 
If set, the number of iterations will be reduced/scaled 
automatically and a metric prefix following the 
International System of Units standard will be added 
(kilo, mega, etc.) [default: False]. 
如果设置,迭代的次数会自动按照十、百、千来添加前缀,默认为false 
dynamic_ncols : bool, optional 
If set, constantly alters ncols to the environment (allowing 
for window resizes) [default: False]. 
不断改变ncols环境,允许调整窗口大小 
smoothing : float, optional 
Exponential moving average smoothing factor for speed estimates 
(ignored in GUI mode). Ranges from 0 (average speed) to 1 
(current/instantaneous speed) [default: 0.3]. 
 
bar_format : str, optional 
Specify a custom bar string formatting. May impact performance. 
If unspecified, will use ‘{l_bar}{bar}{r_bar}', where l_bar is 
‘{desc}{percentage:3.0f}%|' and r_bar is 
‘| {n_fmt}/{total_fmt} [{elapsed_str}<{remaining_str}, {rate_fmt}]' 
Possible vars: bar, n, n_fmt, total, total_fmt, percentage, 
rate, rate_fmt, elapsed, remaining, l_bar, r_bar, desc. 
自定义栏字符串格式化…默认会使用{l_bar}{bar}{r_bar}的格式,格式同上 
 
initial : int, optional 
The initial counter value. Useful when restarting a progress 
bar [default: 0]. 
初始计数器值,默认为0 
position : int, optional 
Specify the line offset to print this bar (starting from 0) 
Automatic if unspecified. 
Useful to manage multiple bars at once (eg, from threads). 
指定偏移,这个功能在多个条中有用 
gui : bool, optional 
WARNING: internal parameter - do not use. 
Use tqdm_gui(…) instead. If set, will attempt to use 
matplotlib animations for a graphical output [default: False]. 
内部参数… 
Returns 
out : decorated iterator. 
返回为一个迭代器

其实不用分析更多代码,多看看几个例子:(官网的例子)

7zx.py压缩进度条

# -*- coding: utf-8 -*- 
"""Usage: 
 7zx.py [--help | options] <zipfiles>... 
Options: 
 -h, --help   Print this help and exit 
 -v, --version Print version and exit 
 -c, --compressed    Use compressed (instead of uncompressed) file sizes 
 -s, --silent  Do not print one row per zip file 
 -y, --yes   Assume yes to all queries (for extraction) 
 -D=<level>, --debug=<level> 
         Print various types of debugging information. Choices: 
             CRITICAL|FATAL 
             ERROR 
             WARN(ING) 
             [default: INFO] 
             DEBUG 
             NOTSET 
 -d, --debug-trace   Print lots of debugging information (-D NOTSET) 
""" 
from __future__ import print_function 
from docopt import docopt 
import logging as log 
import subprocess 
import re 
from tqdm import tqdm 
import pty 
import os 
import io 
__author__ = "Casper da Costa-Luis <casper.dcl@physics.org>" 
__licence__ = "MPLv2.0" 
__version__ = "0.2.0" 
__license__ = __licence__ 
 
 
RE_SCN = re.compile("([0-9]+)\s+([0-9]+)\s+(.*)$", flags=re.M) 
 
 
def main(): 
  args = docopt(__doc__, version=__version__) 
  if args.pop('--debug-trace', False): 
    args['--debug'] = "NOTSET" 
  log.basicConfig(level=getattr(log, args['--debug'], log.INFO), 
          format='%(levelname)s: %(message)s') 
  log.debug(args) 
 
  # Get compressed sizes 
  zips = {} 
  for fn in args['<zipfiles>']: 
    info = subprocess.check_output(["7z", "l", fn]).strip() 
    finfo = RE_SCN.findall(info) 
 
    # builtin test: last line should be total sizes 
    log.debug(finfo) 
    totals = map(int, finfo[-1][:2]) 
    # log.debug(totals) 
    for s in range(2): 
      assert(sum(map(int, (inf[s] for inf in finfo[:-1]))) == totals[s]) 
    fcomp = dict((n, int(c if args['--compressed'] else u)) 
           for (u, c, n) in finfo[:-1]) 
    # log.debug(fcomp) 
    # zips : {'zipname' : {'filename' : int(size)}} 
    zips[fn] = fcomp 
 
  # Extract 
  cmd7zx = ["7z", "x", "-bd"] 
  if args['--yes']: 
    cmd7zx += ["-y"] 
  log.info("Extracting from {:d} file(s)".format(len(zips))) 
  with tqdm(total=sum(sum(fcomp.values()) for fcomp in zips.values()), 
       unit="B", unit_scale=True) as tall: 
    for fn, fcomp in zips.items(): 
      md, sd = pty.openpty() 
      ex = subprocess.Popen(cmd7zx + [fn], 
                 bufsize=1, 
                 stdout=md, # subprocess.PIPE, 
                 stderr=subprocess.STDOUT) 
      os.close(sd) 
      with io.open(md, mode="rU", buffering=1) as m: 
        with tqdm(total=sum(fcomp.values()), disable=len(zips) < 2, 
             leave=False, unit="B", unit_scale=True) as t: 
          while True: 
            try: 
              l_raw = m.readline() 
            except IOError: 
              break 
            l = l_raw.strip() 
            if l.startswith("Extracting"): 
              exname = l.lstrip("Extracting").lstrip() 
              s = fcomp.get(exname, 0) # 0 is likely folders 
              t.update(s) 
              tall.update(s) 
            elif l: 
              if not any(l.startswith(i) for i in 
                    ("7-Zip ", 
                    "p7zip Version ", 
                    "Everything is Ok", 
                    "Folders: ", 
                    "Files: ", 
                    "Size: ", 
                    "Compressed: ")): 
                if l.startswith("Processing archive: "): 
                  if not args['--silent']: 
                    t.write(t.format_interval( 
                      t.start_t - tall.start_t) + ' ' + 
                      l.lstrip("Processing archive: ")) 
                else: 
                  t.write(l) 
      ex.wait() 
 
 
main.__doc__ = __doc__ 
 
 
if __name__ == "__main__": 
  main()

tqdm_wget.py

"""An example of wrapping manual tqdm updates for urllib reporthook. 
# urllib.urlretrieve documentation 
> If present, the hook function will be called once 
> on establishment of the network connection and once after each block read 
> thereafter. The hook will be passed three arguments; a count of blocks 
> transferred so far, a block size in bytes, and the total size of the file. 
Usage: 
  tqdm_wget.py [options] 
Options: 
-h, --help 
  Print this help message and exit 
-u URL, --url URL : string, optional 
  The url to fetch. 
  [default: http://www.doc.ic.ac.uk/~cod11/matryoshka.zip] 
-o FILE, --output FILE : string, optional 
  The local file path in which to save the url [default: /dev/null]. 
""" 
 
import urllib 
from tqdm import tqdm 
from docopt import docopt 
 
 
def my_hook(t): 
  """ 
  Wraps tqdm instance. Don't forget to close() or __exit__() 
  the tqdm instance once you're done with it (easiest using `with` syntax). 
  Example 
  ------- 
  >>> with tqdm(...) as t: 
  ...   reporthook = my_hook(t) 
  ...   urllib.urlretrieve(..., reporthook=reporthook) 
  """ 
  last_b = [0] 
 
  def inner(b=1, bsize=1, tsize=None): 
    """ 
    b : int, optional 
      Number of blocks just transferred [default: 1]. 
    bsize : int, optional 
      Size of each block (in tqdm units) [default: 1]. 
    tsize : int, optional 
      Total size (in tqdm units). If [default: None] remains unchanged. 
    """ 
    if tsize is not None: 
      t.total = tsize 
    t.update((b - last_b[0]) * bsize) 
    last_b[0] = b 
  return inner 
 
 
opts = docopt(__doc__) 
 
eg_link = opts['--url'] 
eg_file = eg_link.replace('/', ' ').split()[-1] 
with tqdm(unit='B', unit_scale=True, leave=True, miniters=1, 
     desc=eg_file) as t: # all optional kwargs 
  urllib.urlretrieve(eg_link, filename=opts['--output'], 
            reporthook=my_hook(t), data=None)

examples.py

""" 
# Simple tqdm examples and profiling 
# Benchmark 
for i in _range(int(1e8)): 
  pass 
# Basic demo 
import tqdm 
for i in tqdm.trange(int(1e8)): 
  pass 
# Some decorations 
import tqdm 
for i in tqdm.trange(int(1e8), miniters=int(1e6), ascii=True, 
           desc="cool", dynamic_ncols=True): 
  pass 
# Nested bars 
from tqdm import trange 
for i in trange(10): 
  for j in trange(int(1e7), leave=False, unit_scale=True): 
    pass 
# Experimental GUI demo 
import tqdm 
for i in tqdm.tgrange(int(1e8)): 
  pass 
# Comparison to https://code.google.com/p/python-progressbar/ 
try: 
  from progressbar.progressbar import ProgressBar 
except ImportError: 
  pass 
else: 
  for i in ProgressBar()(_range(int(1e8))): 
    pass 
# Dynamic miniters benchmark 
from tqdm import trange 
for i in trange(int(1e8), miniters=None, mininterval=0.1, smoothing=0): 
  pass 
# Fixed miniters benchmark 
from tqdm import trange 
for i in trange(int(1e8), miniters=4500000, mininterval=0.1, smoothing=0): 
  pass 
""" 
 
from time import sleep 
from timeit import timeit 
import re 
 
# Simple demo 
from tqdm import trange 
for i in trange(16, leave=True): 
  sleep(0.1) 
 
# Profiling/overhead tests 
stmts = filter(None, re.split(r'\n\s*#.*?\n', __doc__)) 
for s in stmts: 
  print(s.replace('import tqdm\n', '')) 
  print(timeit(stmt='try:\n\t_range = xrange' 
           '\nexcept:\n\t_range = range\n' + s, number=1), 
     'seconds')

pandas_progress_apply.py

import pandas as pd 
import numpy as np 
from tqdm import tqdm 
 
df = pd.DataFrame(np.random.randint(0, 100, (100000, 6))) 
 
# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm` 
# (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.) 
tqdm.pandas(desc="my bar!") 
 
# Now you can use `progress_apply` instead of `apply` 
# and `progress_map` instead of `map` 
df.progress_apply(lambda x: x**2) 
# can also groupby: 
# df.groupby(0).progress_apply(lambda x: x**2) 
 
 
# -- Source code for `tqdm_pandas` (really simple!) 
# def tqdm_pandas(t): 
#  from pandas.core.frame import DataFrame 
#  def inner(df, func, *args, **kwargs): 
#    t.total = groups.size // len(groups) 
#    def wrapper(*args, **kwargs): 
#      t.update(1) 
#      return func(*args, **kwargs) 
#    result = df.apply(wrapper, *args, **kwargs) 
#    t.close() 
#    return result 
#  DataFrame.progress_apply = inner

引用tqdm并非强制作为依赖:

include_no_requirements.py

# How to import tqdm without enforcing it as a dependency 
try: 
  from tqdm import tqdm 
except ImportError: 
  def tqdm(*args, **kwargs): 
    if args: 
      return args[0] 
    return kwargs.get('iterable', None)

参考:
https://github.com/tqdm/tqdm/tree/master/examples
https://pypi.python.org/pypi/tqdm
https://github.com/tqdm/tqdm

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

Python 相关文章推荐
Python 3.x 新特性及10大变化
Jun 12 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
Python多线程实现同步的四种方式
May 02 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
基于pandas中expand的作用详解
Dec 17 Python
Python print不能立即打印的解决方式
Feb 19 Python
python之生成多层json结构的实现
Feb 27 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
python井字棋游戏实现人机对战
Apr 28 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 #Python
Python设计模式之MVC模式简单示例
Jan 10 #Python
Python设计模式之命令模式简单示例
Jan 10 #Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 #Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 #Python
Python设计模式之观察者模式简单示例
Jan 10 #Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 #Python
You might like
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
php ZipArchive压缩函数详解实例
2013/11/06 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
Python sys.argv用法实例
2015/05/28 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
详解如何从TensorFlow的mnist数据集导出手写体数字图片
2019/08/05 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
仓管员岗位责任制
2014/02/19 职场文书
中药学自荐信
2014/06/15 职场文书
班级活动总结格式
2014/08/30 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js