Python urllib2进度钩子

我正在尝试使用urllib2 http客户端在python中创build一个下载进度条。 我已经浏览了API(和谷歌),似乎urllib2不允许你注册进度挂钩。 不过,较旧的已弃用的urllib具有此function。

有谁知道如何使用urllib2创build进度条或报告钩子? 还是有一些其他黑客获得类似的function?

这里有一个充分运作的例子,build立在Anurag在回应中分块的方法上。 我的版本允许你设置块的大小,并附上一个任意的报告function:

import urllib2, sys def chunk_report(bytes_so_far, chunk_size, total_size): percent = float(bytes_so_far) / total_size percent = round(percent*100, 2) sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)\r" % (bytes_so_far, total_size, percent)) if bytes_so_far >= total_size: sys.stdout.write('\n') def chunk_read(response, chunk_size=8192, report_hook=None): total_size = response.info().getheader('Content-Length').strip() total_size = int(total_size) bytes_so_far = 0 while 1: chunk = response.read(chunk_size) bytes_so_far += len(chunk) if not chunk: break if report_hook: report_hook(bytes_so_far, chunk_size, total_size) return bytes_so_far if __name__ == '__main__': response = urllib2.urlopen('http://www.ebay.com'); chunk_read(response, report_hook=chunk_report) 

为什么不只是以块读取数据,而是做任何你想做的事情,例如在一个线程中运行,钩入一个UI等等

 import urllib2 urlfile = urllib2.urlopen("http://www.google.com") data_list = [] chunk = 4096 while 1: data = urlfile.read(chunk) if not data: print "done." break data_list.append(data) print "Read %s bytes"%len(data) 

输出

 Read 4096 bytes Read 3113 bytes done. 

urlgrabber内置了对进度通知的支持。

简化版本:

 temp_filename = "/tmp/" + file_url.split('/')[-1] f = open(temp_filename, 'wb') remote_file = urllib2.urlopen(file_url) try: total_size = remote_file.info().getheader('Content-Length').strip() header = True except AttributeError: header = False # a response doesn't always include the "Content-Length" header if header: total_size = int(total_size) bytes_so_far = 0 while True: buffer = remote_file.read(8192) if not buffer: sys.stdout.write('\n') break bytes_so_far += len(buffer) f.write(buffer) if not header: total_size = bytes_so_far # unknown size percent = float(bytes_so_far) / total_size percent = round(percent*100, 2) sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)\r" % (bytes_so_far, total_size, percent))