学到一招!Python 下载大文件,哪种方式速度更快

Python 下载大文件,哪种方式速度更快 通常,我们都会用 requests 库去下载,这个库用起来太方便了。 阅读详情

 
点击上方“菜鸟学Python”,选择“星标”公众号

超级无敌干货,第一时间送达!!!

e463fb756f20957caad0968805c527b3.jpeg

大家好,我是菜鸟哥。

通常,我们都会用 requests 库去下载,这个库用起来太方便了。

方法一

使用以下流式代码,无论下载文件的大小如何,Python 内存占用都不会增加:

def download_file(url):
    local_filename = url.split('/')[-1]
    # 注意传入参数 stream=True
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                f.write(chunk)
    return local_filename

如果你有对 chunk 编码的需求,那就不该传入 chunk_size 参数,且应该有 if 判断。

def download_file(url):
    local_filename = url.split('/')[-1]
    # 注意传入参数 stream=True
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'w') as f:
            for chunk in r.iter_content(): 
                if chunk:
                    f.write(chunk.decode("utf-8"))
    return local_filename

iter_content[1] 函数本身也可以解码,只需要传入参数 decode_unicode = True 即可。

请注意,使用 iter_content 返回的字节数并不完全是 chunk_size,它是一个通常更大的随机数,并且预计在每次迭代中都会有所不同。

方法二

使用 Response.raw[2] 和 shutil.copyfileobj[3]

import requests
import shutil

def download_file(url):
    local_filename = url.split('/')[-1]
    with requests.get(url, stream=True) as r:
        with open(local_filename, 'wb') as f:
            shutil.copyfileobj(r.raw, f)

    return local_filename

这将文件流式传输到磁盘而不使用过多的内存,并且代码更简单。

注意:根据文档,Response.raw 不会解码,因此如果需要可以手动替换 r.raw.read 方法

response.raw.read = functools.partial(response.raw.read, decode_content=True)

速度

方法二更快。方法一如果 2-3 MB/s 的话,方法二可以达到近 40 MB/s。

参考资料

[1]

iter_content: https://requests.readthedocs.io/en/latest/api/#requests.Response.iter_content

[2]

Response.raw: https://requests.readthedocs.io/en/latest/api/#requests.Response.raw

[3]

shutil.copyfileobj: https://docs.python.org/3/library/shutil.html#shutil.copyfileobj


 

 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的视频!

python实现的类IDM高速下载程序 使用python多线程实现的类IDM下载程序,具有不限网速,速度快等特点,有一定的参考价值,模拟多线程文件IO下载,百行代码左右实现一个快速下载工具。 立即下载

相关推荐

MIT Mini Cheetah--仿真流程

MIT Mini Cheetah–仿真 摘要 由于官方提供代码中,控制仿真环境中的猎豹机器人运动需要遥控器来控制。官方默认推荐使用logitech Gamepad F310游戏手柄:We use the Logitech F310 controller. There’s a switch in the back, which should be in the “X” position. The controller needs to reconnected if you change the switch

Galaxy_Robot的博客 5916

python shutil复制文件夹小技巧,配置好比搜索快

python shutil复制文件夹小技巧,配置好比搜索快然后看看这个文件夹看着这些文件我感到头痛在茫茫文件夹堆中,难道只能一个个搜索吗!!下面说几个点写在最后 事情是这样的,今天同事给我发了一条消息,内容如下: 然后看看这个文件夹 看着这些文件我感到头痛 在茫茫文件夹堆中,难道只能一个个搜索吗!! 不,以我蹩脚的py技巧应该能解决这个问题 于是我上网找资料,果然让我找到了shutil这个包 这就简单了,先看代码 import os; import shutil; path = "F:\产品主图及详情

weixin_45834078的博客 599

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

python下载文件的三种方法

Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块,此外Python还提供了另外一种方法requests。看起来使用urllib最为简单,一句语句即可。

Python热爱者的博客 1万+

WRF和WPS安装和编译时遇到的问题

检查是否自己netcdf和Fortran编译器一致。解决办法:修改configure.wps里的路径。如果没问题且wrf已成功编译,考虑重新。path修改为jasper在的路径。

m0_54898744的博客 1838

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6204

python开发基础知识一

面试常问知识点

weixin_44443311的博客 366

Qt C++ 信号发生器控制软件

waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") {

寒寒豆豆软件公司的博客 125

Python内存溢出问题

摘要:本文通过分析Python下载大文件时出现的"MemoryError"问题,揭示了requests库默认将整个响应体加载到内存的机制缺陷。针对此问题,提出了流式下载解决方案,通过设置stream=True和分块写入技术,将内存占用从文件大小降低到固定8KB左右。文章详细介绍了基础实现、分块优化、断点续传和进度显示等进阶技巧,并通过性能对比测试展示了优化效果(如100MB文件内存占用降低92%)。最后总结了流式下载的适用场景和常见陷阱,帮助开发者构建稳定高效的文件下载服务。

shuijing55hi的博客 541

如何用libwebsocket库在stm32F407上实现websocket客户端?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1135

Pulseaudio之同步/异步(十一)

PulseAudio是一个声音服务器,一个后台进程从一个或多个音源(进程或输入设备)接受声音输入 然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。 PulseAudio的主要特点包括: 可对每一个应用程序进行音量控制Per-application volume controls 可扩展的插件与支持可装载模块架构 兼容性许多流行的音频应用程序 支持多重音源和多重输出 低延时操作和支持延迟测量 一个对处理器资源效率零拷贝内存架构 能够发现本地网络上使用PulseAu

Android系统攻城狮 1004

Python发送POST/GET请求,设置请求头和请求体

python发送http请求

weixin_51722520的博客 1145

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python 下载大文件速度更快的方式

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。这将文件流式传输到磁盘而不使用过多的内存,并且代码更简单。

Trb201013的博客 1702

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Python下载文件,哪种方式速度更快

请注意,使用 iter_content 返回的字节数并不完全是 chunk_size,它是一个通常更大的随机数,并且预计在每次迭代中都会有所不同。如果你有对 chunk 编码的需求,那就不该传入 chunk_size 参数,且应该有 if 判断。:根据文档,Response.raw 不会解码,因此如果需要可以手动替换 r.raw.read 方法。通常,我们都会用 requests 库去下载,这个库用起来太方便了。这将文件流式传输到磁盘而不使用过多的内存,并且代码更简单。

LKIDTI数据的博客 658

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python实现多线程并发下载大文件(断点续传支持)

本文非常浅层的演示了python如何实现多线程文件下载,核心取决于现代服务器基本都支持范围下载的前提下。关于断点续传,文章已提供基本理论和实现思路,有兴趣通过python实现下载器的朋友都可以专门去实现一下。......

小小明-代码实体的专栏 5万+

python 下载大文件

1, 下载,肯定要看进度 优秀的 progress bar tqdm ​ 安装 sudo python3 -m pip install tqdm 1.1, 加环境变量 #!/usr/bin/python3 from tqdm import tqdm import requests 上一步安装 tqdm 的是 python3 , python3 关联到了 tqdm 这个库, 不加环境变量, 走默认的 python 2.7, 不是在 python 2.7 上,安装的这个库 tqdm 2 ,

dengjiangszhan的博客 429

用 PyPy 让你的 Python 代码运行得更快!

Python是开发人员中最常用的编程语言之一,但它有一定的局限性。例如,对于某些应用程序而言,它的运行速度可能比其它语言低100倍。这就是为什么当Python的运行速度成为用户瓶颈后,许...

Python中文社区 6228

一个让Python代码运行更快的最佳方式!

作者 |Serdar Yegulalp译者 |姜松浩,责编 | 屠敏转载自 优快云(ID:优快云news)Python因其强大、灵活且易于使用等特性,而赢得了声誉...

AI科技大本营 3052

【2019.08.20】 python 下载wallhaven壁纸原图, 分别使用同步、异步方式(aiohttp_requests,aiofiles),对比下载速度

本次主要是研究分别使用同步异步的方式下载壁纸原图 'https://alpha.wallhaven.cc/latest’在速度方面的差异 在解析网页时发现原图url不在图片列表页显示,只显示了小图,在详情页中显示原图,可以分析图片url后很同意就可以通过小图拼接出壁纸原图的url。 使用模块 同步 使用 requests bs4 异步 使用 aiohttp_requests aiofile...

ybsde博客 5900

让Python代码运行更快的最佳方式!

作者 |Serdar Yegulalp译者 |姜松浩,责编 | 屠敏出品 | 优快云(ID:优快云news)【导读】PyPy 是 Python 解释器的替代品,对...

Python大本营的博客 2557
上一篇: 39个 Python Datetime 小例子,拯救因时间抓狂的你
下一篇: PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!
菜鸟学Python
博客等级 码龄9年 8088粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值