2011-04-25 103 views
0

所以我想用urllib2制作进度条或百分比。正在下载进度条urllib2 python

,我发现这个代码在不同的问题上堆栈溢出:

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) 

,但我不知道它在哪里下载它。

因此,如何修复此代码以知道它下载到的位置或编码进度条。

回答

2

看起来像数据被丢弃。您可以修改chunk_read函数以将其保存到文件中。

修改chunk_read将返回读取数据:

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 
    data = [] 

    while 1: 
     chunk = response.read(chunk_size) 
     bytes_so_far += len(chunk) 

     if not chunk: 
     break 

     data += chunk 
     if report_hook: 
     report_hook(bytes_so_far, chunk_size, total_size) 

    return "".join(data)