使用python下载大型文件的方法,显示进度条和下载时间
admin
2024-01-18 17:28:33

文章目录

  • requets普通方法
  • 流下载
  • 参考文献

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

相关内容

热门资讯

俄媒:俄罗斯来华游客数量稳步增... 参考消息网11月19日报道 据俄罗斯自由媒体网11月17日报道,自9月15日中国对俄罗斯游客试行免签...
“根本不愁卖,来晚了就没了”!... “在网上看到了,特地来尝鲜。”近日,“00后”陈女士打卡了一款名为“奶皮子糖葫芦”的零食。这款零食由...
重磅发布!2026全球高端餐厅... 来源:携程美食林 当用户真实评价 与顶尖美食家的专业洞察交汇 呈现给所有人的不仅是榜单的更迭 更是携...
治愈系美食爱情微短剧《宴遇簪花... 作为泉州成功入选“世界美食之都”后的首部治愈系美食爱情微短剧,《宴遇簪花缘》今日正式公布首轮剧照。首...
【京·花果蜜】怀柔栗子天团,申... 谁能拒绝这一美味?栗子酥、冰栗、栗子蛋糕…个个都是实力派!这口百年老树的甜,你最爱哪一款?