網站首頁 編程語言 正文
推薦閱讀
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
原文鏈接:https://blog.csdn.net/weixin_35770067/article/details/127623920
相關推薦
- 2022-12-06 Python基礎面向對象之繼承與派生詳解_python
- 2022-11-29 C#泛型的使用案例_C#教程
- 2023-04-01 Python之維度dim的定義及其理解使用方式_python
- 2022-05-14 Centos8安裝docker報錯(錯誤提示:All?mirrors?were?tried)的問題_
- 2022-11-20 更強大的React?狀態管理庫Zustand使用詳解_React
- 2022-12-01 C++中單鏈表操作的示例代碼_C 語言
- 2022-11-18 詳解SFTP命令_linux shell
- 2023-01-26 Redis的數據復制過程詳解_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支