使用Python实现带进度条的异步多文件下载器

 更新时间:2025年11月26日 09:46:17   作者:weixin_46244623  
本文详细介绍了如何使用 Python + asyncio + aiohttp + tqdm 实现一个 带进度条的异步多文件下载器,文中的示例代码讲解详细,有需要的可以了解下

摘要

本文详细介绍了如何使用 Python + asyncio + aiohttp + tqdm 实现一个 带进度条的异步多文件下载器。相比传统的同步下载方式,异步下载不仅能够显著提高下载速度,还能在终端显示每个文件的实时下载进度条,适用于大文件、多文件并发下载等场景。文章提供了详细中文注释的完整代码示例,读者可以直接拷贝运行。同时也介绍了核心原理、依赖库、适用场景等内容,非常适合学习 Python 异步 IO 编程的开发者参考。

使用的库说明

  • asyncio:Python 内置的异步协程库,用于并发执行任务。
  • aiohttp:支持用于异步 HTTP 请求,比 requests 更适合同步下载。
  • tqdm:终端显示进度条的工具。

安装依赖:

pip install aiohttp tqdm

异步下载的优势

无需多线程,也能同时下载多个文件

避免同步阻塞,大幅提升下载速度

每个任务都能显示独立进度条

核心思路

使用 aiohttp.ClientSession() 进行异步请求

使用 await response.content.read(1024) 异步读取内容

使用 tqdm 显示进度条

使用 asyncio.gather() 并发执行多个下载任务

适用场景

下载多个大文件(Zip、MP4、模型文件等)

写爬虫批量下载文件

后台批处理任务

分布式下载系统

完整代码

import aiohttp
import asyncio
from tqdm import tqdm

# 异步下载函数
async def download_file(url, destination):
    """
    异步下载文件并显示下载进度条

    :param url:          文件下载地址
    :param destination:  本地保存文件路径
    """
    # 创建 aiohttp 会话
    async with aiohttp.ClientSession() as session:
        # 发送 GET 请求
        async with session.get(url) as response:
            # 获取文件总大小(如果服务器支持)
            total_size = int(response.headers.get("Content-Length", 0))

            # 打开本地文件,准备写入下载内容
            with open(destination, "wb") as f:
                # tqdm 进度条
                progress_bar = tqdm(
                    total=total_size,         # 总大小
                    unit="B",                 # 单位:字节
                    unit_scale=True,          # 自动转换 KB / MB
                    desc=f"下载中: {destination}"  # 显示的标题
                )

                # 持续读取数据(每次读取 1024 字节)
                while True:
                    chunk = await response.content.read(1024)
                    if not chunk:   # 读取完毕
                        break
                    f.write(chunk)
                    progress_bar.update(len(chunk))  # 更新进度条

                progress_bar.close()  # 下载完成后关闭进度条


# 主异步函数
async def main():
    """
    批量创建多个下载任务,并异步并发执行
    """

    # 要下载的文件列表(可自行扩展)
    download_tasks = [
        {
            "url": "http://example.com/file1.zip",
            "destination": "file1.zip"
        },
        {
            "url": "http://example.com/file2.zip",
            "destination": "file2.zip"
        },
        # 可以继续添加更多文件
    ]

    # 为每个任务创建一个 download_file 协程
    tasks = [
        download_file(task["url"], task["destination"])
        for task in download_tasks
    ]

    # 并发执行所有下载任务
    await asyncio.gather(*tasks)


# 程序入口
if __name__ == "__main__":
    # 运行异步主函数
    asyncio.run(main())

以上就是使用Python实现带进度条的异步多文件下载器的详细内容,更多关于Python带进度条的文件下载器的资料请关注脚本之家其它相关文章!

相关文章

  • python multiprocessing多进程变量共享与加锁的实现

    python multiprocessing多进程变量共享与加锁的实现

    这篇文章主要介绍了python multiprocessing多进程变量共享与加锁的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 基于Mediapipe+Opencv实现手势检测功能

    基于Mediapipe+Opencv实现手势检测功能

    mediaPipe,他就是一个集成好的包括人脸关键位点识别、身体关键位点识别、手部关键位点识别的一个包或者库,直接调用就能够得到它的关键位点信息,本文给大家介绍Mediapipe+Opencv实现手势检测功能,感兴趣的朋友一起看看吧
    2022-01-01
  • Flask与FastAPI对比选择最佳Python Web框架的超详细指南

    Flask与FastAPI对比选择最佳Python Web框架的超详细指南

    Flask和FastAPI都是流行的Python Web框架,各有特点,Flask轻量级、灵活,适合小型项目和原型开发但不支持异步操作,FastAPI高性能、支持异步,内置数据验证和自动生成API文档,适合高并发和API开发,需要的朋友可以参考下
    2025-02-02
  • Python列表切片用法示例

    Python列表切片用法示例

    这篇文章主要介绍了Python列表切片用法,结合实例形式分析了Python列表切片的常见操作方法及相关注意事项,需要的朋友可以参考下
    2017-04-04
  • 详解python之异步编程

    详解python之异步编程

    这篇文章主要为大家介绍了python之异步编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比

    python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比

    这篇文章主要给大家介绍了关于python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • python实时监控logstash日志代码

    python实时监控logstash日志代码

    这篇文章主要介绍了python实时监控logstash日志代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 解决安装pyqt5之后无法打开spyder的问题

    解决安装pyqt5之后无法打开spyder的问题

    今天小编就为大家分享一篇解决安装pyqt5之后无法打开spyder的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 通过Python OpenGL的point sprite技术绘制雪花

    通过Python OpenGL的point sprite技术绘制雪花

    通常,点精灵(point sprite)技术被用于描述大量粒子在屏幕上的运动,自然也可以用于绘制雪花。本文将通过Python OpenGL绘制雪花,感兴趣的可以动手试一试
    2022-02-02
  • Python实现简单猜数字游戏

    Python实现简单猜数字游戏

    这篇文章主要为大家详细介绍了Python实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02

最新评论