使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼
推薦閱讀
Python 給下載文件顯示進(jìn)度條和下載時(shí)間的實(shí)現(xiàn)
requets普通方法
下載大型文件時(shí),我們一般都是這樣下載的
import requests
url = ""
r = requests.get(url)
with open('1.mp4', 'wb') as f:
f.write(r.content)這樣下載大型文件時(shí)存在一個(gè)問(wèn)題,那就是內(nèi)存使用量迅速上升,可能會(huì)造成電腦卡死。所以我們需要換一個(gè)方式進(jìn)行下載
流下載
我們可以使用文本流進(jìn)行下載.
在requests模塊中有一個(gè)這樣的方法Response.iter_content()
Response響應(yīng)對(duì)象的一個(gè)方法
iter_content(chunk_size=1, decode_unicode=False)
在響應(yīng)數(shù)據(jù)上進(jìn)行重做。當(dāng)stream=True設(shè)置在請(qǐng)求上時(shí),這可以避免立即將內(nèi)容讀入內(nèi)存以獲得大響應(yīng)。塊大小是它應(yīng)該讀入內(nèi)存的字節(jié)數(shù)。這不一定是每個(gè)返回的項(xiàng)目的長(zhǎng)度,因?yàn)榻獯a可以進(jìn)行。
chunk_size必須是類型 int 或 None。值為None時(shí)會(huì)因stream的值而異。stream-True將讀取數(shù)據(jù)的字塊大小與接收的區(qū)塊相同。如果stream=False,則數(shù)據(jù)將作為單個(gè)塊返回。
如果decode_unicode設(shè)置為真,響應(yīng)內(nèi)容將根據(jù)使用最佳編碼進(jìn)行解碼。
需要在get請(qǐng)求上設(shè)置參數(shù)stream為True,它不會(huì)立即開(kāi)始下載,當(dāng)使用iter_content遍歷內(nèi)容或訪問(wèn)內(nèi)容屬性時(shí)才開(kāi)始下載。
代碼實(shí)現(xiàn):
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)加個(gè)進(jìn)度條模塊
# 進(jìn)度條模塊
def progressbar(url,path):
if not os.path.exists(path): # 看是否有該文件夾,沒(méi)有則創(chuàng)建文件夾
os.mkdir(path)
start = time.time() #下載開(kāi)始時(shí)間
response = requests.get(url, stream=True) #stream=True必須寫上
size = 0 #初始化已下載大小
chunk_size = 1024 # 每次下載的數(shù)據(jù)大小
content_size = int(response.headers['content-length']) # 下載文件總大小
try:
if response.status_code == 200: #判斷是否響應(yīng)成功
print('Start download,[File size]:{size:.2f} MB'.format(size = content_size / chunk_size /1024)) #開(kāi)始下載,顯示下載文件大小
filepath = path+'\name.extension name' #設(shè)置圖片name,注:必須加上擴(kuò)展名
with open(filepath,'wb') as file: #顯示進(jìn)度條
for data in response.iter_content(chunk_size = chunk_size):
file.write(data)
size +=len(data)
print('\r'+'[下載進(jìn)度]:%s%.2f%%' % ('>'*int(size*50/ content_size), float(size / content_size * 100)) ,end=' ')
end = time.time() #下載結(jié)束時(shí)間
print('Download completed!,times: %.2f秒' % (end - start)) #輸出下載用時(shí)時(shí)間
except:現(xiàn)原理其實(shí)很簡(jiǎn)單,我們一般下載東西使用的requests.get(url).content的方法下載來(lái)的文件是二進(jìn)制文件,我們只要通過(guò)for循環(huán)每次下載1024kb,到最后獲取文件的總大小,即可完成我們的功能實(shí)現(xiàn)了!.
參考文獻(xiàn)
https://blog.csdn.net/m0_46778548/article/details/121180585
https://blog.csdn.net/weixin_43347550/article/details/105248223
到此這篇關(guān)于使用python下載大型文件的方法顯示進(jìn)度條和下載時(shí)間的文章就介紹到這了,更多相關(guān)python下載文件顯示進(jìn)度條和下載時(shí)間內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
python通過(guò)pillow識(shí)別動(dòng)態(tài)驗(yàn)證碼的示例代碼
在上網(wǎng)時(shí),經(jīng)常會(huì)遇到驗(yàn)證碼,本次試驗(yàn)將帶領(lǐng)大家認(rèn)識(shí)驗(yàn)證碼的一些特性,并利用 Python 中的 pillow 庫(kù)完成對(duì)驗(yàn)證碼的破解。感興趣的可以了解一下2021-11-11
python切片中內(nèi)存的注意事項(xiàng)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python切片中內(nèi)存的注意事項(xiàng)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-08-08
Python實(shí)現(xiàn)將一個(gè)大文件按段落分隔為多個(gè)小文件的簡(jiǎn)單操作方法
這篇文章主要介紹了Python實(shí)現(xiàn)將一個(gè)大文件按段落分隔為多個(gè)小文件的簡(jiǎn)單操作方法,涉及Python針對(duì)文件的讀取、遍歷、轉(zhuǎn)換、寫入等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04

