如何使用Python从远程Zip归档通过HTTP读取选定文件?

问题描述:

我需要使用Python从远程zip存档中读取与文件名匹配的选定文件。我不想将完整的zip保存到一个临时文件(它不是那么大,所以我可以处理内存中的所有内容)。如何使用Python从远程Zip归档通过HTTP读取选定文件?

我已经编写了代码,它的工作原理,我自己回答,以便稍后可以搜索它。但是由于证据表明我是*的参与者之一,我相信还有改进的空间。

这里是我是如何做到的(在抢夺“.ranks”结尾的文件):

import urllib2, cStringIO, zipfile 

try: 
    remotezip = urllib2.urlopen(url) 
    zipinmemory = cStringIO.StringIO(remotezip.read()) 
    zip = zipfile.ZipFile(zipinmemory) 
    for fn in zip.namelist(): 
     if fn.endswith(".ranks"): 
      ranks_data = zip.read(fn) 
      for line in ranks_data.split("\n"): 
       # do something with each line 
except urllib2.HTTPError: 
    # handle exception 
+0

要替换的第一行:进口的urllib2,zip文件。 – Jim 2008-09-18 17:08:51

记住,只是解压ZIP文件可能会导致a security vulnerability

感谢马塞尔提供的问题和答案(我在不同的环境中遇到了同样的问题,并且遇到了类似文件的对象的相同难题,但并不像文件一样)!正如更新:对于Python 3.0,您的代码需要稍微修改:

import urllib.request, io, zipfile 

try: 
    remotezip = urllib.request.urlopen(url) 
    zipinmemory = io.BytesIO(remotezip.read()) 
    zip = zipfile.ZipFile(zipinmemory) 
    for fn in zip.namelist(): 
     if fn.endswith(".ranks"): 
      ranks_data = zip.read(fn) 
      for line in ranks_data.split("\n"): 
       # do something with each line 
except urllib.request.HTTPError: 
    # handle exception 

这将完成这项工作,无需下载整个zip文件!

http://pypi.python.org/pypi/pyremotezip