在Python中,我们有许多可用的库,可以帮助我们为程序创建一个简单的进度条。在本文中,我们将逐一讨论每种方法。
Using print
创建自定义函数打印进度条,我们计算所需的总迭代次数,在每次迭代中,我们递增符号并打印它。
创建打印函数
import timedef progress (percent=0 , width=50 , desc="Processing" ): left = width * percent // 100 right = width - left tags = "#" * left spaces = "-" * right percents = f"{percent:.0 f} %" print (f"\r{desc} : [{tags} {spaces} ]{percents} " , end="" , flush=True ) for i in range (101 ): progress(i) time.sleep(0.05 )
当print
函数指定end=""
时,表示不换行,再使用"\r"
将光标移至当前行首,相当于覆盖了之前打印出来的东西,看起来就像只有百分比在变化。
自定义进度条类
创建进度条类,代码见 Github 库
单进度条 :使用ProgressBar(iterable)
包装任何可迭代对象
import time import progressbar as pbarfor char in pbar.ProgressBar('abcd' ): time.sleep(0.05 )
或者手动调用 update
方法更新
import time import progressbar as pbarx = range (100 ) progress = pbar.ProgressBar(x, circle=True ) for i,value in enumerate (x): progress.update(i) time.sleep(0.05 )
多任务进度条 :创建多进度条实例,多线程调用任务
import time import progressbar as pbardef test_func (num,sec ): time.sleep(sec) return num * 2 bars = pbar.MultiProgressBar() bars.add_task('task1' , pbar.ProgressBar(range (3 ),desc='task1' ), test_func, 1 ) bars.add_task('task2' , pbar.ProgressBar('ab' ,desc='task2' ), test_func, 1 ) bars.add_task('task3' , pbar.ProgressBar('ABCD' ,desc='task3' ), test_func, 1 ) bars.start(['task2' ,'task1' , 'task3' ])
Using tqdm
tqdm 库用于在Python和命令行创建快速有效的进度条。详细的用法可以参考官方文档
包装迭代对象
使用tqdm(iterable)
包装任何可迭代对象。默认情况下,该进度条显示剩余时间、每秒迭代次数和百分比。
from tqdm import tqdmfrom time import sleepfor char in tqdm(["a" , "b" , "c" , "d" ], desc="Processing" ): sleep(0.25 )
trange(N)
是 tqdm(range(N))
的快捷方式
from tqdm import trangefor i in trange(100 , desc="Processing" ): sleep(0.01 )
手动更新
使用with
语句手动控制tqdm()
更新
with tqdm(total=100 ) as pbar: for i in range (10 ): sleep(0.1 ) pbar.update(10 )
with
也是可选的,您可以将 tqdm()
分配给一个变量,但在这种情况下,不要忘记在末尾使用del
或close
pbar = tqdm(total=100 ) for i in range (10 ): sleep(0.1 ) pbar.update(10 ) pbar.close()
嵌套进度条
from tqdm.auto import trangefrom time import sleepfor i in trange(4 , desc='1st loop' ): for j in trange(5 , desc='2nd loop' ): for k in trange(50 , desc='3rd loop' , leave=False ): sleep(0.01 )
Pandas 集成
import pandas as pdimport numpy as npfrom tqdm import tqdmdf = pd.DataFrame(np.random.randint(0 , 100 , (100000 , 6 ))) tqdm.pandas(desc="my bar!" ) df.progress_apply(lambda x: x**2 )
Using progressbar2
一个 Python 进度条库,为长时间运行的操作提供可视化(基于文本)进度。详细的用法可以参考官方文档
包装迭代对象
import timeimport progressbarfor i in progressbar.progressbar(range (100 )): time.sleep(0.02 )
手动更新
import timeimport progressbarwith progressbar.ProgressBar(max_value=10 ) as bar: for i in range (10 ): time.sleep(0.1 ) bar.update(i)
Using rich
Rich主要是用于在终端中打印丰富多彩的文本。详细的用法可以参考官方文档
包装迭代对象
将任何序列包装在track
函数中并迭代结果。内置列包括完成百分比、文件大小、文件速度和剩余时间。
import timefrom rich.progress import trackfor i in track(range (20 ), description="Processing..." ): time.sleep(1 )
多任务进度条
如果您需要在终端中显示多个任务进度条,则可以直接使用Progress
类。构建 Progress
对象后,使用 ( add_task()
添加任务,并使用 update()
更新进度。
import timefrom rich.progress import Progresswith Progress() as progress: task1 = progress.add_task("[red]Downloading..." , total=1000 ) task2 = progress.add_task("[green]Processing..." , total=1000 ) task3 = progress.add_task("[cyan]Cooking..." , total=1000 ) while not progress.finished: progress.update(task1, advance=0.5 ) progress.update(task2, advance=0.3 ) progress.update(task3, advance=0.9 ) time.sleep(0.02 )