小屋創作

日誌2020-05-31 11:05

urlretrieve

作者:Yotsuba

Copy a network object denoted by a URL to a local file .

urlretrieve 的文件解釋是從網址複製一個網路上的物件到本地檔案

如果以 Context Manager 下載檔案,幾乎也是一模一樣的行為

就是把請求來的檔案,也寫入 (複製) 一份到本地

不過 urlretrieve 提供了額外的功能


總之先上一段 Code :


import sys
from urllib.request import urlretrieve


def progress(block_num, block_size, total_size):
    # block_num  : A count of blocks transferred so far
    # block_size : A block size in bytes
    # total_size : The total size of the file

    sys.stdout.write('\rDownloading %s %.1f%%' % (filename, float(block_num * block_size) / float(total_size) * 100.0))
    sys.stdout.flush()


url      = 'https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz'
filename = 'Python-3.8.3.tgz'


urlretrieve(url, filename, progress)
print()


實際上 urlretrieve 的函數宣告是 :

urllib.request.urlretrieve(url, filename = None, reporthook = None, data = None)

參數分別是網址、檔案名稱、一個 Callback Function 還有 data ... ?

我查資料查了很久,都沒有看到 data 的使用方式,查詢標準的文件也沒看到相關說明

所以我也不知道那參數是幹嘛的 ...


直接說 Callback Function 的部分,Callback Function 裡面又需要三個參數

根據文件解釋,第一個參數回傳有幾個 block

第二個參數回傳一個 block 的 bytes 大小

第三個參數回傳檔案總大小,也是 bytes 計算

由此可得一個公式 : block_num * block_size / total_size * 100 就是下載百分比


Code 的部分是去下載 Python 3.8.3 的壓縮檔,總共 22.9 MB

你可以執行一次,這樣就可以看到 Callback Function 實現的進度條效果


一般來說下載檔案使用 Context Manager 就很夠用了

而我覺得 urlretrieve 的優勢就在於多一個 Callback Function 可以使用

大部分時候就會用來寫進度條,讓自己知道下載進度

適合用在檔案較大的情境


當然 urlretrieve 做的事情還有很多啦,主要是一些例外處理等等

不過以爬蟲應用來說,知道這些就算是足夠

2

3

LINE 分享

相關創作

賓士貓困洪水!「緊抓車門把手」掙扎求生

白貓高爾夫1.5周年活動跟近期遊玩心得w

這TM到底什麼審核標準!

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】