如何使用Python通过HTTP从远程Zip存档中读取所选文件?

时间:2020-03-06 14:22:24  来源:igfitidea点击:

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

我已经编写了代码并且可以正常工作,我自己回答了这个问题,以便稍后进行搜索。但是由于有证据表明我是Stackoverflow的愚蠢参与者之一,因此我确信仍有改进的空间。

解决方案

这是我的操作方法(抓取所有以" .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

请记住,仅解压缩ZIP文件可能会导致安全漏洞。

感谢Marcel提出的问题和答案(我在不同上下文中遇到了相同的问题,并且在类文件对象并非真正像文件一样时遇到了相同的困难)!就像一个更新:对于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