我想用urllib2下载文件,同时我想显示一个进度条.. 但是如何才能获得实际下载的文件大小?
我目前的代码是
ul = urllib2.urlopen('www.file.com/blafoo.iso')
data = ul.get_data()
或
open('file.iso', 'w').write(ul.read())
如果从网站上收到整个下载,则首先将数据写入文件。 如何访问下载的数据大小?
感谢您的帮助
答案 0 :(得分:7)
以下是使用真棒requests库和progressbar库的文本进度条示例:
import requests
import progressbar
ISO = "http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts"
CHUNK_SIZE = 1024 * 1024 # 1MB
r = requests.get(ISO)
total_size = int(r.headers['content-length'])
pbar = progressbar.ProgressBar(maxval=total_size).start()
file_contents = ""
for chunk in r.iter_content(chunk_size=CHUNK_SIZE):
file_contents += chunk
pbar.update(len(file_contents))
这是我在运行时在控制台中看到的内容:
$ python requests_progress.py
90% |############################ |
编辑:一些注释:
答案 1 :(得分:4)
您可以使用urllib2的info
函数返回the meta-information of the page
,而您可以使用getheaders
访问Content-Length
。
例如,让我们计算Ubuntu 12.04 ISO
>>> info = urllib2.urlopen('http://mirror01.th.ifl.net/releases//precise/ubuntu-12.04-desktop-i386.iso')
>>> size = int(info.info().getheaders("Content-Length")[0])
>>> size/1024/1024
701
>>>
答案 2 :(得分:1)
import urllib2
with open('file.iso', 'wb') as output: # Note binary mode otherwise you'll corrupt the file
with urllib2.urlopen('www.file.com/blafoo.iso') as ul:
CHUNK_SIZE = 8192
bytes_read = 0
while True:
data = ul.read(CHUNK_SIZE)
bytes_read += len(data) # Update progress bar with this value
output.write(data)
if len(data) < CHUNK_SIZE: #EOF
break