Python progress bar and downloads

匿名 (未验证) 提交于 2019-12-03 02:30:02

问题:

I have a python script that launches a URL that is a downloadable file. Is there some way to have python use commandline to display the download progress as oppose to launching the browser?

回答1:

Updated for your sample url:

I've just written a super simple (slightly hacky) approach to this for scraping pdfs off a certain site. Note, it only works correctly on unix based systems (linux, mac os) as powershell does not handle "\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() 

It uses the requests library so you'll need to install that. This outputs something like the following into your console:

>Downloading download.data

The progress bar is 52 characters wide in the script (2 characters are simply the [] so 50 characters of progress). Each = represents 2% of the download.



回答2:

You can use the 'clint' package (written by the same author as 'requests') to add a simple progress bar to your downloads like this:

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() 

which will give you a dynamic output which will look like this:

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

It should work on multiple platforms as well! You can also change the bar to dots or a spinner with .dots and .mill instead of .bar.

Enjoy!



回答3:

I think you can also use click , and it has a good library for progress bar also.

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

Enjoy !



回答4:

I'm surprised that tqdm has not been suggested!



回答5:

You can stream a downloads as it is here -> Stream a Download.

Also you can Stream Uploads.

The most important streaming a request is done unless you try to access the response.content with just 2 lines

for line in r.iter_lines():         if line:         print(line) 

Stream Requests



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!