1. 程式人生 > >Python實現斷點續傳下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!

Python實現斷點續傳下載檔案,大檔案下載還怕下載到一半就斷了嗎?不存在!

這篇部落格簡單介紹python斷點續傳下載檔案,並加入花哨的下載進度顯示方法,涉及Python檔案操作的技巧,和一些函式庫的使用。

環境

Python 3.6
requests模組
對應檔案的下載連結 (要下載的檔案必須支援斷點續傳
(是不是很少東西?那必須,python就是這麼強大!)

乾貨

下面直接上程式碼,關鍵是簡單易懂,複製就能用,拿走不謝。

import sys
import requests
import os

# 遮蔽warning資訊
requests.packages.urllib3.disable_warnings()

def download(url, file_path)
:
# 第一次請求是為了得到檔案總大小 r1 = requests.get(url, stream=True, verify=False) total_size = int(r1.headers['Content-Length']) # 這重要了,先看看本地檔案下載了多少 if os.path.exists(file_path): temp_size = os.path.getsize(file_path) # 本地已經下載的檔案大小 else: temp_size = 0 # 顯示一下下載了多少 print(temp_size) print(total_size) # 核心部分,這個是請求下載時,從本地檔案已經下載過的後面下載
headers = {'Range': 'bytes=%d-' % temp_size} # 重新請求網址,加入新的請求頭的 r = requests.get(url, stream=True, verify=False, headers=headers) # 下面寫入檔案也要注意,看到"ab"了嗎? # "ab"表示追加形式寫入檔案 with open(file_path, "ab") as f: for chunk in r.iter_content(chunk_size=1024): if chunk: temp_size += len(chunk) f.write(chunk) f.flush() ###這是下載實現進度顯示####
done = int(50 * temp_size / total_size) sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size)) sys.stdout.flush() print() # 避免上面\r 回車符 if __name__ == '__main__': link = r'https://api.gdc.cancer.gov/data/' UUID = r'2a4a3044-0b1a-4722-83ed-43ba5d6d25b0' path = r'F:\SYY\temp\a.txt' url = os.path.join(link, UUID) # 呼叫一下函式試試 download(url, path)

下面演示一遍:
這裡寫圖片描述