python实现进度条的方法和实现代码
在Python中,有多种方式可以实现进度条。这里,我将介绍七种常见的方法:使用tqdm
(这是一个外部库,非常流行且易于使用)、rich、click、progressbar2等库以及纯Python的print
函数与time
库来模拟进度条。
目录
一、使用tqdm库
二、使用纯Python实现
三、使用rich库
四、使用click库
五、使用progressbar2库
六、使用PySimpleGUI库
七、使用curses库(Unix/Linux)
一、使用tqdm
库
首先,你需要安装tqdm
库。你可以使用pip来安装:
pip install tqdm
然后,你可以使用以下代码来显示进度条:
from tqdm import tqdm
import time # 模拟一个需要花费时间的任务
for i in tqdm(range(100)): time.sleep(0.01) # 假设每个迭代需要0.01秒
在这个例子中,tqdm
会自动处理进度条的显示,你不需要做其他任何事情。每次迭代时,进度条都会更新。
效果:
10%|█ | 10/100 [00:01<00:09, 9.98it/s]
二、使用纯Python实现
如果你不想使用外部库,你也可以使用Python的print
函数和time
库来模拟一个简单的进度条。但是请注意,这种方法没有tqdm
那么灵活和强大。
以下是一个简单的例子:
import time
import sys def print_progress_bar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill='█', printEnd="\r"): """ Call in a loop to create terminal progress bar @params: iteration - Required : current iteration (Int) total - Required : total iterations (Int) prefix - Optional : prefix string (Str) suffix - Optional : suffix string (Str) decimals - Optional : positive number of decimals in percent complete (Int) length - Optional : character length of bar (Int) fill - Optional : bar fill character (Str) printEnd - Optional : end character (e.g. "\r", "\r\n") (Str) """ percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) filledLength = int(length * iteration // total) bar = fill * filledLength + '-' * (length - filledLength) print(f'\r{prefix} |{bar}| {percent}% {suffix}', end=printEnd) # Print New Line on Complete if iteration == total: print() # 模拟一个需要花费时间的任务
for i in range(100): time.sleep(0.01) # 假设每个迭代需要0.01秒 print_progress_bar(i + 1, 100, prefix='Progress:', suffix='Complete', length=50)
在这个例子中,print_progress_bar
函数用于打印进度条。它接受当前迭代次数、总迭代次数和其他一些可选参数。在每次迭代中,我们调用这个函数来更新进度条。注意,我们在循环结束后添加了一个额外的换行符,以便在进度条完成后清除终端中的最后一行。
除了使用tqdm
库和纯Python的print
函数与time
库来模拟进度条之外,还有其他几种方法可以实现进度条。这里我将介绍两种额外的方法:
三、使用rich
库
rich
库是一个用于创建丰富文本和漂亮终端输出的Python库,它也包括了一个强大的进度条功能。
首先,你需要安装rich
库:
pip install rich
然后,你可以使用以下代码来显示进度条:
from rich.progress import Progress
import time with Progress() as progress: task = progress.add_task("Processing...", total=100) for i in range(100): time.sleep(0.01) # 假设每个迭代需要0.01秒 progress.update(task, advance=1)
效果:
Processing... ███████████▏ 50/100 [00:04<00:04, 11.97it/s]
四、使用click
库
click
库是一个用于创建命令行接口的库,它也提供了一个简单的进度条实现。
首先,你需要安装click
库:
pip install click
但是,请注意,click
的进度条主要用于命令行工具,并且可能不如tqdm
或rich
那么灵活。不过,如果你正在开发一个命令行工具,它可能是个不错的选择。
以下是一个使用click
库的简单示例:
import click
import time @click.command()
def cli(): with click.progressbar(range(100)) as bar: for item in bar: time.sleep(0.01) # 假设每个迭代需要0.01秒 if __name__ == '__main__': cli()
在这个例子中,我们定义了一个cli
函数,并使用click.progressbar
上下文管理器来包装一个范围。在每次迭代中,进度条会自动更新。
以上介绍了四种不同的方法来实现Python中的进度条:使用tqdm
库、纯Python的print
函数与time
库、rich
库和click
库。每种方法都有其优缺点,你可以根据你的具体需求来选择最适合你的方法。如果你需要一个简单且易于使用的库,tqdm
可能是一个很好的选择。如果你需要更丰富的终端输出和更多的控制选项,rich
可能更适合你。如果你正在开发一个命令行工具,并且需要进度条功能,那么click
可能是一个好选择。
当然,还有其他方法可以实现Python中的进度条,尽管它们可能不如前面提到的库那样全面或易于使用。以下是一些额外的方法:
五、使用progressbar2
库
progressbar2
是另一个流行的库,用于在Python中创建进度条。虽然它的功能可能与tqdm
相似,但如果你更喜欢这个库,可以尝试使用它。
首先,你需要安装progressbar2
库:
pip install progressbar2
然后,你可以使用以下代码来显示进度条:
from progressbar import ProgressBar
import time bar = ProgressBar(max_value=100)
for i in range(100): time.sleep(0.01) # 假设每个迭代需要0.01秒 bar.update(i + 1)
bar.finish()
六、使用PySimpleGUI
库
PySimpleGUI
是一个用于创建图形用户界面(GUI)的库,但它也支持在控制台应用程序中显示进度条。这个库非常适合那些希望在控制台应用程序中添加更多交互性的用户。
首先,你需要安装PySimpleGUI
库:
pip install pysimplegui
然后,你可以使用以下代码来显示一个控制台进度条:
import PySimpleGUI as sg
import time # 创建一个进度条元素
progress_bar = sg.ProgressBar(100, orientation='h', size=(50, 15), key='progressbar') # 创建一个窗口,其中包含进度条
layout = [[progress_bar]]
window = sg.Window('Progress Bar', layout) # 启动事件循环
for i in range(101): event, values = window.read(timeout=100) progress_bar.update_bar(i + 1) time.sleep(0.01) # 假设每个迭代需要0.01秒 # 关闭窗口
window.close()
七、使用curses
库(Unix/Linux)
在Unix和Linux系统上,你可以使用curses
库来创建文本用户界面,包括进度条。但是,请注意,curses
库在Windows上不可用。
首先,你需要确保你的系统上安装了curses
库(在大多数Linux发行版上都是预装的)。然后,你可以使用以下代码来显示一个基本的进度条:
import curses
import time def main(stdscr): # 清除屏幕 stdscr.clear() # 初始化颜色对(可选) curses.start_color() curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK) # 创建一个进度条窗口 height, width = stdscr.getmaxyx() progress_bar_width = 50 progress_bar_start = (height // 2) - 1 progress_bar_end = progress_bar_start + 1 for i in range(101): # 清除进度条行 stdscr.addstr(progress_bar_start, 0, ' ' * width) # 计算并显示进度条 filled_length = int((i / 100.0) * progress_bar_width) stdscr.addstr(progress_bar_start, (width - progress_bar_width) // 2, '[' + '=' * filled_length + ' ' * (progress_bar_width - filled_length) + ']') # 刷新屏幕以显示更新 stdscr.refresh() # 模拟进度 time.sleep(0.01) # 等待用户按键退出 stdscr.getkey() # 使用curses包装器运行main函数
curses.wrapper(main)
这些方法提供了不同的方式来在Python中创建和显示进度条,你可以根据你的具体需求和目标平台来选择最适合你的方法。
相关文章:
python实现进度条的方法和实现代码
在Python中,有多种方式可以实现进度条。这里,我将介绍七种常见的方法:使用tqdm(这是一个外部库,非常流行且易于使用)、rich、click、progressbar2等库以及纯Python的print函数与time库来模拟进度条。 目录…...

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?
引言:在使用 MyBatis 进行数据库操作时,#{} 和 ${} 的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。 题目 被拷打已老实&…...
C# —— while循环语句
作用 让顺序执行的代码 可以停下来 循环执行某一代码块 // 条件分支语句: 让代码产生分支 进行执行 // 循环语句 : 让代码可以重复执行 语法 while循环 while (bool值) { 循环体(条件满足时执行的代码块) …...
力扣第205题“同构字符串”
在本篇文章中,我们将详细解读力扣第205题“同构字符串”。通过学习本篇文章,读者将掌握如何使用哈希表来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第205题“…...
探索RESTful API开发,构建可扩展的Web服务
介绍 当我们浏览网页、使用手机应用或与各种互联网服务交互时,我们经常听到一个术语:“RESTful API”。它听起来很高深,但实际上,它是构建现代网络应用程序所不可或缺的基础。 什么是RESTful API? 让我们将RESTful …...
苹果安卓网页的H5封装成App的应用和原生开发的应用有什么不一样?
H5封装类成App的应用和原生应用有什么不一样?——一对比谈优缺点 1. 开发速度和复用性 H5封装的App优势:一次编写,多平台运行。你只需要使用一种语言编写代码,就可以发布到不同的平台,降低开发成本。 原生应用优势&…...

IO流2.
字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…...

详解MySQL中的PERCENT_RANK函数
目录 1. 引入1. 基本使用2:分组使用3:处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中,PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …...
宏任务与微任务
一、宏任务 1、概念 指消息队列中等地被主线程执行的事件 2、种类 script主代码块、setTimeout 、setInterval 、nodejs的setImmediate 、MessageChannel(react的fiber用到)、postMessage、网络I/O、文件I/O、用户交互的回调等事件、UI渲染事件&#x…...

昇思大模型学习·第一天
mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…...
python调用chatgpt
简单写了一下关于文本生成接口的调用,其余更多的调用方法可在官网查看 import os from dotenv import load_dotenv, find_dotenv from openai import OpenAI import httpxdef gpt_config():# 为了安全起见,将key写到当前项目根目录下的.env文件中# find…...

YOLOV8 目标检测:训练自定义数据集
1、下载 yolov8项目:ultralytics/ultralytics:新增 - PyTorch 中的 YOLOv8 🚀 > ONNX > OpenVINO > CoreML > TFLite --- ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreM…...
动态更新自建的Redis连接池连接数量
/*** 定时更新Redis连接池信息,防止资源让费*/private static final ScheduledThreadPoolExecutor DYNAMICALLY_UPDATE_REDIS_POOL_THREAD new ScheduledThreadPoolExecutor(1, new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread thread …...

浅谈设计师的设计地位
在当今这个创意无限的时代,设计师的地位日益凸显。他们以独特的视角和精湛的技能,为我们的生活带来了无尽的色彩与灵感。然而,随着行业的不断发展,设计师如何在众多同行中脱颖而出,提升自己的设计地位呢?答…...

C/C++ string模拟实现
1.模拟准备 1.1因为是模拟string,防止与库发生冲突,所以需要命名空间namespace隔离一下,我们来看一下基本内容 namespace yx {class string{private://char _buff[16]; lunix下小于16字节就存buff里char* _str;size_t _size;size_t _capac…...
微信小程序学习(八):behaviors代码复用
小程序的 behaviors 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。 如果需要 behavior 复用代码,需要使用 Behavior() 方法,…...
【The design pattern of Attribute-Based Dynamic Routing Pattern (ADRP)】
In ASP.NET Core, routing is one of the core functionalities that maps HTTP requests to the corresponding controller actions. While “Route-Driven Design Pattern” is a coined name for a design pattern, we can construct a routing-centric design pattern base…...

2713. 矩阵中严格递增的单元格数
题目 给定一个 m x n 的整数矩阵 mat,我们需要找出从某个单元格出发可以访问的最大单元格数量。移动规则是可以从当前单元格移动到同一行或同一列的任何其他单元格,但目标单元格的值必须严格大于当前单元格的值。需要返回最大可访问的单元格数量。 示例…...
git创建子模块
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 Git …...

把Deepin塞进U盘,即插即用!Deepin To Go来袭
前言 小伙伴之前在某篇文章下留言说:把Deepin塞进U盘的教程。 这不就来了吗? 事实是可以的。这时候你要先做点小准备: 一个大小为8GB或以上的普通U盘 一个至少64GB或以上的高速U盘 一个Deepin系统镜像文件 普通U盘的大概介绍࿱…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...