国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python3使用requests模塊實現顯示下載進度的方法詳解

2020-02-16 01:09:20
字體:
來源:轉載
供稿:網友

本文實例講述了Python3使用requests模塊實現顯示下載進度的方法。分享給大家供大家參考,具體如下:

一、配置request

1. 相關資料

請求關鍵參數:stream=True。默認情況下,當你進行網絡請求后,響應體會立即被下載。你可以通過 stream 參數覆蓋這個行為,推遲下載響應體直到訪問 Response.content 屬性。

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'r = requests.get(tarball_url, stream=True)

此時僅有響應頭被下載下來了,連接保持打開狀態,因此允許我們根據條件獲取內容:

if int(r.headers['content-length']) < TOO_LONG: content = r.content ...

進一步使用 Response.iter_contentResponse.iter_lines 方法來控制工作流,或者以 Response.raw 從底層urllib3的 urllib3.HTTPResponse

from contextlib import closingwith closing(requests.get('http://httpbin.org/get', stream=True)) as r:  # Do things with the response here.

保持活動狀態(持久連接)

歸功于urllib3,同一會話內的持久連接是完全自動處理的,同一會話內發出的任何請求都會自動復用恰當的連接!

注意:只有當響應體的所有數據被讀取完畢時,連接才會被釋放到連接池;所以確保將 stream 設置為 False 或讀取 Response 對象的 content 屬性。

2. 下載文件并顯示進度條

with closing(requests.get(self.url(), stream=True)) as response:  chunk_size = 1024 # 單次請求最大值  content_size = int(response.headers['content-length']) # 內容體總大小  progress = ProgressBar(self.file_name(), total=content_size,                   unit="KB", chunk_size=chunk_size, run_status="正在下載", fin_status="下載完成")  with open(file_name, "wb") as file:    for data in response.iter_content(chunk_size=chunk_size):      file.write(data)      progress.refresh(count=len(data))

二、進度條類的實現

在Python3中,print()方法的默認結束符(end='/n'),當調用完之后,光標自動切換到下一行,此時就不能更新原有輸出。

將結束符改為“/r”,輸出完成之后,光標會回到行首,并不換行。此時再次調用print()方法,就會更新這一行輸出了。

結束符也可以使用“/d”,為退格符,光標回退一格,可以使用多個,按需求回退。

在結束這一行輸出時,將結束符改回“/n”或者不指定使用默認

下面是一個格式化的進度條顯示模塊。代碼如下:

class ProgressBar(object):  def __init__(self, title,         count=0.0,         run_status=None,         fin_status=None,         total=100.0,         unit='', sep='/',         chunk_size=1.0):    super(ProgressBar, self).__init__()    self.info = "【%s】%s %.2f %s %s %.2f %s"    self.title = title    self.total = total    self.count = count    self.chunk_size = chunk_size    self.status = run_status or ""    self.fin_status = fin_status or " " * len(self.status)    self.unit = unit    self.seq = sep  def __get_info(self):    # 【名稱】狀態 進度 單位 分割線 總數 單位    _info = self.info % (self.title, self.status,               self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)    return _info  def refresh(self, count=1, status=None):    self.count += count    # if status is not None:    self.status = status or self.status    end_str = "/r"    if self.count >= self.total:      end_str = '/n'      self.status = status or self.fin_status    print(self.__get_info(), end=end_str)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荣昌县| 香港 | 巴马| 澜沧| 济南市| 安陆市| 光山县| 集贤县| 长子县| 九龙坡区| 凤冈县| 玉田县| 崇明县| 台北市| 海丰县| 毕节市| 鄄城县| 纳雍县| 普兰县| 拜城县| 思南县| 延长县| 库尔勒市| 镇雄县| 三门峡市| 津市市| 山东省| 宜兰县| 汕尾市| 乐东| 连城县| 西昌市| 文安县| 峨眉山市| 祁东县| 美姑县| 宜都市| 赤峰市| 新晃| 六盘水市| 洛浦县|