有时候需要使用Python下载一个比较大的文件,我们利用Python的多线程Threading
来完成,然后根据文件大小分配线程和每个线程的文件大小。
def Handler(start, end, url, filename):
headers = {'Range': 'bytes=%d-%d' % (start, end)}
with requests.get(url, headers=headers,stream=True) as r:
with open(filename, "r+b") as fp:
fp.seek(start)
var = fp.tell()
fp.write(r.content)
def download(url,tittle, num_thread = 10):
r = requests.head(url)
try:
file_name = tittle
file_size = int(r.headers['content-length'])
except:
print("检查URL,或不支持对线程下载")
return
fp = open(file_name, "wb")
fp.truncate(file_size)
fp.close()
part = file_size // num_thread
for i in range(num_thread):
start = part * i
if i == num_thread - 1:
end = file_size
else:
end = start + part
t = threading.Thread(target=Handler, kwargs={'start': start, 'end': end, 'url': url, 'filename': file_name})
t.setDaemon(True)
t.start()
# 等待所有线程下载完成
main_thread = threading.current_thread()
for t in threading.enumerate():
if t is main_thread:
continue
t.join()
print('%s 下载完成' % file_name)