【问题标题】:How do I read selected files from a remote Zip archive over HTTP using Python?如何使用 Python 通过 HTTP 从远程 Zip 存档中读取选定的文件?
【发布时间】:2013-01-22 22:43:27
【问题描述】:

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

我已经编写了代码并且它可以工作,我正在自己回答这个问题,以便我以后可以搜索它。但既然有证据表明我是 Stackoverflow 上比较笨的参与者之一,我相信还有改进的余地。

【问题讨论】:

    标签: python http zip


    【解决方案1】:

    我是这样做的(抓取所有以“.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
    

    【讨论】:

    • 您想将第一行替换为:import urllib2, zipfile。
    • 你为什么不用ZipFile(urllib2.urlopen(url))
    • 我试过了,但我无法让它工作,因为即使它是一个类似文件的对象,它也不支持 Zipfile 需要的特定功能。这就是我用 cStringIO 缓冲它的原因。
    • zip 文件的目录存储在最后,因此在提取之前必须下载整个文件,无论是到内存中还是在磁盘上。
    • 创建自己的类文件对象来包装 url 并不难,因此您不必下载整个内容:stackoverflow.com/questions/7829311/…
    【解决方案2】:

    感谢 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
    

    【讨论】:

      【解决方案3】:

      这将在不下载整个 zip 文件的情况下完成这项工作!

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

      【讨论】:

        【解决方案4】:

        请记住,仅解压缩 ZIP 文件可能会导致 a security vulnerability

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          相关资源
          最近更新 更多