使用urllib2stream式处理大型二进制文件

我使用下面的代码将大型文件从Internet传输到本地文件中:

fp = open(file, 'wb') req = urllib2.urlopen(url) for line in req: fp.write(line) fp.close() 

这工作,但它下载相当缓慢。 有更快的方法吗? (这些文件很大,所以我不想把它们留在内存中。)

没有理由一行一行地工作(小块,并要求Pythonfind你的行结束! – ),只是把它块大块,例如:

 # from urllib2 import urlopen # Python 2 from urllib.request import urlopen # Python 3 response = urlopen(url) CHUNK = 16 * 1024 with open(file, 'wb') as f: while True: chunk = response.read(CHUNK) if not chunk: break f.write(chunk) 

用各种CHUNK尺寸进行实验,find符合您要求的“最佳位置”。

你也可以使用shutil :

 import shutil try: from urllib.request import urlopen # Python 3 except ImportError: from urllib2 import urlopen # Python 2 def get_large_file(url, file, length=16*1024): req = urlopen(url) with open(file, 'wb') as fp: shutil.copyfileobj(req, fp, length) 

我曾经使用mechanize模块和它的Browser.retrieve()方法。 过去它花费了100%的CPU和下载的东西非常慢,但最近的一些版本修复了这个bug并且工作得很快。

例:

 import mechanize browser = mechanize.Browser() browser.retrieve('http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.32-rc1.tar.bz2', 'Downloads/my-new-kernel.tar.bz2') 

机械化基于urllib2,所以urllib2也可以有类似的方法…但我现在找不到任何东西。

你可以使用urllib.retrieve()来下载文件:

例:

 try: from urllib import urlretrieve # Python 2 except ImportError: from urllib.request import urlretrieve # Python 3 url = "http://www.examplesite.com/myfile" urlretrieve(url,"./local_file")