首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python urllib2进度挂钩

Python urllib2进度挂钩
EN

Stack Overflow用户
提问于 2010-01-08 23:22:50
回答 5查看 22.5K关注 0票数 29

我正在尝试使用urllib2 http客户端在python中创建一个下载进度条。我看过这个应用程序接口(在谷歌上),似乎urllib2不允许你注册进度钩子。但是,旧的不推荐使用的urllib确实具有此功能。

有人知道如何使用urllib2创建进度条或报告挂钩吗?或者,有没有其他的黑客手段来获得类似的功能?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-09 03:11:23

这里有一个完整的工作示例,它基于Anurag的在响应中分块的方法。我的版本允许你设置块大小,并附加一个任意的报告函数:

代码语言:javascript
复制
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)
票数 42
EN

Stack Overflow用户

发布于 2010-01-08 23:48:04

为什么不以块的形式读取数据,然后在两者之间做任何你想做的事情,例如在线程中运行,挂接到UI中等等

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
Read 4096 bytes
Read 3113 bytes
done.
票数 12
EN

Stack Overflow用户

发布于 2010-01-08 23:53:02

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2028517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档