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

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

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

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

4 Solutions collect form web for “使用urllib2stream式处理大型二进制文件”

没有理由一行一行地工作(小块,并要求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") 
  • 使用HTTP代理 - Python
  • 使用urllib2进行POST调用而不是GET
  • 如何使用urllib2制作HTTP DELETE方法?
  • Python URLLib / URLLib2 POST
  • 我如何加快在python中使用urllib2获取页面?
  • 通过url获取json数据并用于python(simplejson)
  • 使用urllib2login到网站 - Python 2.7
  • urllib2和httplib线程安全吗?
  • AttributeError(“'str'对象没有属性'read'”)
  • Python3错误:“导入错误:没有模块名称urllib2”
  • Python urllib2.urlopen()很慢,需要更好的方法来阅读几个url