首页 > 编程语言 >Python 下载大文件,哪种方式速度更快

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

时间:2022-08-27 09:24:42浏览次数:81  
标签:文件 raw Python True chunk filename url local 下载

转载:Python 下载大文件,哪种方式速度更快 (qq.com)

方法一

使用以下流式代码,无论下载文件的大小如何,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

标签:文件,raw,Python,True,chunk,filename,url,local,下载
From: https://www.cnblogs.com/testzcy/p/16629811.html

相关文章

  • Java Servlet 入门: 问题系列:Filter中通过HttpServletRequest.getParts()获取不到上传
    问题:一开始以为Servlet 没有提供对文件读取的相关内容。后来发现,HttpServletRequest中有getParts方法,可以获取上传的文件。再后发,经过反复测试,发现都读不到相关内容。......
  • flask 解决日志重复打印问题 or Python日志重复打印
    背景:业务代码上线后,莫名会重复输出很多相同的日志,已知以为是多线程问题,后仔细了解期logging原理后发现并非如此。以下为解决方案fromflaskimportFlaskas_Flaskfro......
  • 06.python闭包
    python闭包什么样的函数是闭包函数?满足以下条件:闭:外层函数嵌套了一个内层函数。包:内层函数调用外层函数命名空间内的名字。举例如下:defout_func():#外层函数......
  • 学习python-Day48
    今日学习内容JS获取用户输入有两种方式:普通数据(输入、选择)​ 标签对象.value文件数据(上传)​ 标签对象.files​ 标签对象.files[0]JS类属性操作let标签......
  • QT使用HTTP下载来实现程序下载自动安装退出,同时读取JSON更新信息。
    最近在用QT开发一套免费的HelpDesk系统,参考了网上的方法,实现了程序自动下载更新和程序自动退出再安装新程序,为了感谢网页的无私分享,自己也特地分享给大家,希望可以帮助到大......
  • 集合分区和文件分区
    切分计划set[0,6)123456[6,13)78910111213[13,20)14151617181920[floor((n-1)*(N/P)),floor(n*N/P))file[0,6] 1,2,3,4[7,12] 5,6......
  • uniapp 图片文件流
    uni.request({url:'*****',//仅为示例,并非真实接口地址。method:'GET',responseType:'arraybuffer',data:{},header:{'content-type':'application/j......
  • Python枚举用法_Enum
    #-*-coding:utf-8-*-fromenumimportEnum,unique#1.枚举的定义#首先,定义枚举要导入enum模块。#枚举定义用class关键字,继承Enum类。#2.如果要限制定......
  • 【2022-08-26】python前端开发(五)
    python前端开发(五)JS获取值操作普通数据(输入、选择) 标签对象.value文件数据(上传) 标签对象.files 标签对象.files[0]leti1Ele=document.getElementById('d1......
  • 传奇哥配置文件 Maven git 8.26 第二阶段
    早上run狂神的贪吃蛇。自己开始练项目1小时写出来晚上2小时成功完成!gitee配置不成功,明天问老师自己创建个仓库。https://gitee.com/设计个tedu/tmooc的网站项目......