您可以使用更少的代码来更普遍地解决此问题。本质上,创建足够多的文件状对象供ZipFile使用。这样您就结束了,
z =ZipFile(HttpFile(url))它会动态下载所需的部分。这样做的好处是您编写的代码更少,并且不仅适用于zip文件,还适用于更多代码。(实际上,我想知道是否已经有类似的东西了……我没有找到。)
使用相同的想法,您还可以为HttpFile创建一个缓存包装程序,以避免重复下载。
这是代码:(请注意缺少错误处理)
#!/usr/bin/pythonimport urllib2class HttpFile(object): def __init__(self, url): self.url = url self.offset = 0 self._size = -1 def size(self): if self._size < 0: f = urllib2.urlopen(self.url) self._size = int(f.headers["Content-length"]) return self._size def read(self, count=-1): req = urllib2.Request(self.url) if count < 0: end = self.size() - 1 else: end = self.offset + count - 1 req.headers['Range'] = "bytes=%s-%s" % (self.offset, end) f = urllib2.urlopen(req) data = f.read() # FIXME: should check that we got the range expected, etc. chunk = len(data) if count >= 0: assert chunk == count self.offset += chunk return data def seek(self, offset, whence=0): if whence == 0: self.offset = offset elif whence == 1: self.offset += offset elif whence == 2: self.offset = self.size() + offset else: raise Exception("Invalid whence") def tell(self): return self.offset


