Python如何使用Requests下載文件并且顯示進度條
引言
本篇文章來分享一下如何使用 Requests 下載文件并且顯示進度條。
下載文件
說到下載文件,大家可能一下子就能寫出以下的代碼:
import requests total = 10485 url = f'https://speed.cloudflare.com/__down?during=download&bytes={total}' # 上面的 URL 是 cloudflare 的測試鏈接,可以傳入想要下載的長度 res = requests.get(url) with open('test.file', 'wb') as file: file.write(res.content) print('下載完成')
這樣寫當然沒問題,但是有幾個問題:
- 文件內(nèi)容都放到了內(nèi)存中,并且沒有下載進度
- 如果文件很大,不光下載時間很久,而且占用很大內(nèi)存無法釋放,只有下載完成后才能釋放
- 沒有下載進度,不知道下載是否還在進行中,不知道何時結(jié)束,不知道下載的狀態(tài)
Requests 分塊下載
為了解決上面的問題,我們需要用到流式傳輸,在使用 Requests 進行下載時,只需要將 stream 設(shè)置 True,即可開啟流式傳輸,Requests 不會從服務(wù)器一次性將內(nèi)容全部下載到本地,而是根據(jù)需求分塊的從服務(wù)器獲取內(nèi)容,然后對內(nèi)容進行處理。
舉個例子:
import json import requests r = requests.get('https://httpbin.org/stream/20', stream=True) for line in r.iter_lines(): # filter out keep-alive new lines if line: decoded_line = line.decode('utf-8') print(json.loads(decoded_line))
給下載加上進度條
為了解決下載的時候沒有進度像是卡住的問題,可以在下載的時候加上進度條, 并且分塊進行下載,而不是將數(shù)據(jù)全部放到內(nèi)存中,防止占用過大的內(nèi)存。
進度條我們使用tqdm 庫,tqdm 庫是一個功能強大且極具實用性的 Python 進度條工具,它能夠以直觀的可視化進度條形式清晰展示循環(huán)迭代、文件處理等各類任務(wù)的執(zhí)行進度,極大提升程序運行狀態(tài)的可視性與用戶體驗,廣泛應用于數(shù)據(jù)處理、機器學習訓練等眾多領(lǐng)域,方便開發(fā)者與使用者實時掌握任務(wù)進展情況并有效優(yōu)化程序運行流程。
先安裝:
poetry add tqdm # 或者 pip install tqdm
安裝好后,對之前的下載代碼進行優(yōu)化,并且使用流式傳輸方法改造一下:
import requests from tqdm import tqdm total = 104857600 # 100M url = f'https://speed.cloudflare.com/__down?during=download&bytes={total}' res = requests.get(url, stream=True) # 上面的 URL 是 cloudflare 的測試鏈接,可以傳入想要下載的長度,如果是正常的下載文件,需要通過下面的代碼來獲取總長度 # file_size = int(response.headers.get("Content - Length", 0)) print(total) with open('test.file', 'wb') as file, tqdm( desc='test.file', total=total, unit='iB', unit_scale=True, unit_divisor=1024, ) as bar: for data in res.iter_content(chunk_size=1024): size = file.write(data) bar.update(size)
下載效果:
可以看到,不光有了進度條,還有了下載速度,而且還有總大小和已經(jīng)下載的大小和預估時間,信息是相當全面了。
總結(jié)
上面的方法在下載大文件時非常有用,不僅可以清楚地看到下載的進度,還能避免一次性將整個文件讀取到內(nèi)存中,從而節(jié)省內(nèi)存資源,提高程序的穩(wěn)定性和效率。
到此這篇關(guān)于Python如何使用Requests下載文件并且顯示進度條的文章就介紹到這了,更多相關(guān)Python Requests下載文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入解析Python中BeautifulSoup4的基礎(chǔ)知識與實戰(zhàn)應用
BeautifulSoup4正是一款功能強大的解析器,能夠輕松解析HTML和XML文檔,本文將介紹BeautifulSoup4的基礎(chǔ)知識,并通過實際代碼示例進行演示,感興趣的可以了解下2024-02-02python django 訪問靜態(tài)文件出現(xiàn)404或500錯誤
這篇文章主要介紹了python django 訪問靜態(tài)文件出現(xiàn)404或500錯誤的相關(guān)資料,需要的朋友可以參考下2017-01-01解決python web項目意外關(guān)閉,但占用端口的問題
今天小編就為大家分享一篇解決python web項目意外關(guān)閉,但占用端口的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python的加密模塊之hashlib 與 base64詳解及常用加密方法
我們來學習一下 Python 中的加密模塊,加密模塊在工作中被廣泛應用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過把數(shù)據(jù)加密。這樣即使被捕獲也無法獲取到數(shù)據(jù)的真實信息,今天我們就來學習一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧2023-02-02Python?生成多行重復數(shù)據(jù)的方法實現(xiàn)
本文主要介紹了Python?生成多行重復數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03