使用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")