当前位置 : 主页 > 编程语言 > python >

使用python下载大型文件显示进度条和下载时间的操作代码

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 推荐阅读 requets普通方法 流下载 加个进度条模块 参考文献 推荐阅读 Python 给下载文件显示进度条和下载时间的实现 requets普通方法 下载大型文件时,我们一般都是这样下载的 im
目录
  • 推荐阅读
  • requets普通方法
  • 流下载
  • 加个进度条模块
  • 参考文献

推荐阅读

Python 给下载文件显示进度条和下载时间的实现

requets普通方法

下载大型文件时,我们一般都是这样下载的

import requests
url = ""
r = requests.get(url)
with open('1.mp4', 'wb') as f:
    f.write(r.content)

这样下载大型文件时存在一个问题,那就是内存使用量迅速上升,可能会造成电脑卡死。所以我们需要换一个方式进行下载

流下载

我们可以使用文本流进行下载.
requests模块中有一个这样的方法Response.iter_content()
Response响应对象的一个方法

iter_content(chunk_size=1, decode_unicode=False)

在响应数据上进行重做。当stream=True设置在请求上时,这可以避免立即将内容读入内存以获得大响应。块大小是它应该读入内存的字节数。这不一定是每个返回的项目的长度,因为解码可以进行。

chunk_size必须是类型 int 或 None。值为None时会因stream的值而异。stream-True将读取数据的字块大小与接收的区块相同。如果stream=False,则数据将作为单个块返回。

如果decode_unicode设置为真,响应内容将根据使用最佳编码进行解码。

需要在get请求上设置参数stream为True,它不会立即开始下载,当使用iter_content遍历内容或访问内容属性时才开始下载。

代码实现:

url = ""
r = requests.get(url, headers=header, stream=True)
with open('1.mp4', "wb") as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

加个进度条模块

# 进度条模块
def progressbar(url,path):
    if not os.path.exists(path):   # 看是否有该文件夹,没有则创建文件夹
         os.mkdir(path)
    start = time.time() #下载开始时间
    response = requests.get(url, stream=True) #stream=True必须写上
    size = 0    #初始化已下载大小
    chunk_size = 1024  # 每次下载的数据大小
    content_size = int(response.headers['content-length'])  # 下载文件总大小
    try:
        if response.status_code == 200:   #判断是否响应成功
            print('Start download,[File size]:{size:.2f} MB'.format(size = content_size / chunk_size /1024))   #开始下载,显示下载文件大小
            filepath = path+'\name.extension name'  #设置图片name,注:必须加上扩展名
            with open(filepath,'wb') as file:   #显示进度条
                for data in response.iter_content(chunk_size = chunk_size):
                    file.write(data)
                    size +=len(data)
                    print('\r'+'[下载进度]:%s%.2f%%' % ('>'*int(size*50/ content_size), float(size / content_size * 100)) ,end=' ')
        end = time.time()   #下载结束时间
        print('Download completed!,times: %.2f秒' % (end - start))  #输出下载用时时间
    except:

现原理其实很简单,我们一般下载东西使用的requests.get(url).content的方法下载来的文件是二进制文件,我们只要通过for循环每次下载1024kb,到最后获取文件的总大小,即可完成我们的功能实现了!.

参考文献

https://blog.csdn.net/m0_46778548/article/details/121180585

https://blog.csdn.net/weixin_43347550/article/details/105248223

到此这篇关于使用python下载大型文件的方法显示进度条和下载时间的文章就介绍到这了,更多相关python下载文件显示进度条和下载时间内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

网友评论