使用python下载大型文件显示进度条和下载时间的操作代码
安替-AnTi 人气:0推荐阅读
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
加载全部内容