2013-03-26 90 views
27

我有一個python腳本,啓動一個URL是一個可下載的文件。有沒有辦法讓python使用命令行顯示下載進度,反對啓動瀏覽器?Python的進度條和下載

+4

如果我的答案解決了您的問題,請將其標記爲已接受(點擊小勾號大綱)。 – Endophage 2013-08-12 01:49:24

回答

51

更新爲您的樣品網址:

我剛寫了一個超級簡單(略哈克)的辦法處理這一刮PDF文件關閉某個網站。請注意,它只是正常工作在基於UNIX系統(Linux,Mac OS)的PowerShell不會處理「\ r」

link = "http://indy/abcde1245" 
file_name = "download.data" 
with open(file_name, "wb") as f: 
     print "Downloading %s" % file_name 
     response = requests.get(link, stream=True) 
     total_length = response.headers.get('content-length') 

     if total_length is None: # no content length header 
      f.write(response.content) 
     else: 
      dl = 0 
      total_length = int(total_length) 
      for data in response.iter_content(chunk_size=4096): 
       dl += len(data) 
       f.write(data) 
       done = int(50 * dl/total_length) 
       sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)))  
       sys.stdout.flush() 

它使用requests library所以你需要安裝。該輸出類似於下面的到你的控制檯:

>Downloading download.data

>[=============                            ]

進度條寬52個字符的腳本(2個字符是簡單的[]這樣的進度50個字符)。每個=代表下載的2%。

+0

我該如何appliy到這個網址http:// indy/abcde1245 – user1607549 2013-03-26 18:58:08

+1

@ user1607549已更新用於您的示例鏈接 – Endophage 2013-03-26 19:02:51

+0

請求沒有被定義在任何地方 – user1607549 2013-03-26 19:12:43

44

您可以使用「clint」包(由同一作者的「請求」寫的),以一個簡單的進度欄添加到您的下載這樣的:

from clint.textui import progress 

r = requests.get(url, stream=True) 
path = '/some/path/for/file.txt' 
with open(path, 'wb') as f: 
    total_length = int(r.headers.get('content-length')) 
    for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): 
     if chunk: 
      f.write(chunk) 
      f.flush() 

,這將給你一個動態輸出,看起來像這樣:

[################################] 5210/5210 - 00:00:01 

它應該在多個平臺上工作!你將can also change設置爲圓點或者帶有.dots和.mill而不是.bar的微調。

享受!

+1

如果這可以成爲python標準庫的一部分,那將會很棒。 – 2014-08-16 08:16:31

+0

'路徑'是什麼? – 2015-02-01 15:19:20

+0

path是要保存文件的文件名。 – tshrinivasan 2015-12-06 16:53:44

4

我認爲你也可以使用click,它也有一個很好的進度條庫。

import click 
with click.progressbar(length=total_size, label='Downloading files') as bar: 
    for file in files: 
     download(file) 
     bar.update(file.size) 

Enjoy!

+1

點擊也是python3.6標準庫的一部分,所以不需要額外安裝 – MortenB 2017-06-21 10:17:14

+0

@MortenB是不是?我得到了'ModuleNotFoundError:3.6.1上沒有名爲'click''的模塊。 – nyuszika7h 2017-08-12 09:29:53

3

我很驚訝,tqdm尚未提出訪問response.content 的要求完成了! enter image description here