我正在编写一个程序来下载大文件,并添加了一个功能,该程序确定已下载的百分比并在每次下载另外10%时通知用户及其下载时间(例如,print(str(percent)+“已下载” + str(time)))。但是当我在较小的文件上测试程序时,我发现它的准确性要低得多。以下是我制作的样例程序:
import urllib.request
def printout(a, b, c):
print(str(a) + ", " + str(b) + ", " + str(c))
urllib.request.urlretrieve("http://downloadcenter.mcafee.com/products/tools/foundstone/fport.zip", r"C:\Users\Username\Downloads\fport.zip", reporthook = printout)
这里是下载Fport的工具,我本来就想要下载。下载完成后,输出结果如下:
0, 8192, 57843
1, 8192, 57843
2, 8192, 57843
3, 8192, 57843
4, 8192, 57843
5, 8192, 57843
6, 8192, 57843
7, 8192, 57843
8, 8192, 57843
我认为这正是我想要的。当我要把它放进去时,我注意到了一个小错误。8192不能被57843整除,不是8倍。我用计算器计算后发现,实际上大约可以整除7次,考虑到这样的误差还是很大的。这种偏差对于更大的文件影响较小,但仍然存在。这是某种元数据或标头吗?如果是,它相当大,不是吗?我该如何解决它(例如,它总是约16000字节)?
urllib
而不是urllib2
吗? - KnightOfNiurllib.request.urlretrieve
,它只被记录在遗留接口的一部分中,并且“在未来某个时间可能变得过时”。 - abarnertreporthook
并不能实现你想要的功能——在某些情况下,urlretrieve
会将所有内容下载到内存中;它从不通知您看到的字节数;由于它处理的是预解码而不是后解码字节,因此它也无济于事;等等。他们可以修复这个问题,但据我所知,计划是为3.5构建一个新的类似于requests
的API,然后逐步淘汰urlretrieve
和其他“遗留”接口,最后逐步淘汰当前的“现代”接口。所以,如果您可以等待2-4年来编写此脚本... :) - abarnert