#!/usr/bin/env python3 import urllib.request def loadfile(url, fname, bsize=1024, ihook=None): data = urllib.request.urlopen(url) out = open(fname, 'wb') with data, out: block = True cur_size = 0 tot_size = int(data.headers['Content-Length']) while block: block = data.read(bsize) out.write(block) if ihook is not None: blen = len(block) if blen > 0: cur_size += blen ihook(cur_size, tot_size) def print_percent(cur, tot): print('\r{:d}%'.format(int(100 * cur / tot)), end='') if cur == tot: print() def main(): url = 'http://cdn.download.comodo.com' \ '/av/updates51/sigs/bases/bases.cav' ofname = 'bases.cav' loadfile(url, ofname, ihook=print_percent) if __name__ == '__main__': main()
Это неточное воспроизведение urlretrieve(), сама urlretrieve() считается устаревшей. Тут в хук подаётся не три, а два аргумента - текущий размер и общий размер.
Пример:
>>> import dlper >>> dlper.loadfile('http://www.yandex.ru', 'yandex.html', ihook=lambda c, t: print('Current:', c, 'Total:', t)) Current: 1024 Total: 62280 Current: 2048 Total: 62280 Current: 3072 Total: 62280 Current: 4096 Total: 62280 Current: 5120 Total: 62280 Current: 6144 Total: 62280 Current: 7168 Total: 62280 Current: 8192 Total: 62280 Current: 9216 Total: 62280 Current: 10240 Total: 62280 Current: 11264 Total: 62280 Current: 12288 Total: 62280 Current: 13312 Total: 62280 Current: 14336 Total: 62280 Current: 15360 Total: 62280 Current: 16384 Total: 62280 Current: 17408 Total: 62280 Current: 18432 Total: 62280 Current: 19456 Total: 62280 Current: 20480 Total: 62280 Current: 21504 Total: 62280 Current: 22528 Total: 62280 Current: 23552 Total: 62280 Current: 24576 Total: 62280 Current: 25600 Total: 62280 Current: 26624 Total: 62280 Current: 27648 Total: 62280 Current: 28672 Total: 62280 Current: 29696 Total: 62280 Current: 30720 Total: 62280 Current: 31744 Total: 62280 Current: 32768 Total: 62280 Current: 33792 Total: 62280 Current: 34816 Total: 62280 Current: 35840 Total: 62280 Current: 36864 Total: 62280 Current: 37888 Total: 62280 Current: 38912 Total: 62280 Current: 39936 Total: 62280 Current: 40960 Total: 62280 Current: 41984 Total: 62280 Current: 43008 Total: 62280 Current: 44032 Total: 62280 Current: 45056 Total: 62280 Current: 46080 Total: 62280 Current: 47104 Total: 62280 Current: 48128 Total: 62280 Current: 49152 Total: 62280 Current: 50176 Total: 62280 Current: 51200 Total: 62280 Current: 52224 Total: 62280 Current: 53248 Total: 62280 Current: 54272 Total: 62280 Current: 55296 Total: 62280 Current: 56320 Total: 62280 Current: 57344 Total: 62280 Current: 58368 Total: 62280 Current: 59392 Total: 62280 Current: 60416 Total: 62280 Current: 61440 Total: 62280 Current: 62280 Total: 62280 >>>

спасибо за помощь. но так не получилось у меня. я написал такой дуратский скрипт. даже Айдл не хочет работать 
