2013-03-26 92 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