Как мне прочитать выбранные файлы из удаленного архива Zip через HTTP, используя Python? - PullRequest
10 голосов
/ 18 сентября 2008

Мне нужно прочитать выбранные файлы, соответствующие имени файла, из удаленного zip-архива с использованием Python. Я не хочу сохранять полный zip-файл во временный файл (он не такой большой, поэтому я могу обрабатывать все в памяти).

Я уже написал код, и он работает, и я отвечаю на него сам, чтобы найти его позже. Но поскольку факты свидетельствуют о том, что я один из более тупых участников Stackoverflow, я уверен, что есть возможности для улучшения.

Ответы [ 4 ]

8 голосов
/ 18 сентября 2008

Вот как я это сделал (захват всех файлов, оканчивающихся на «.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
3 голосов
/ 22 января 2013

Это сделает работу без загрузки всего zip-файла!

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

3 голосов
/ 05 июня 2009

Спасибо Марселю за ваш вопрос и ответ (у меня была та же проблема в другом контексте и я столкнулся с той же проблемой с объектами, похожими на файлы, которые на самом деле не похожи на файлы)! Как обновление: для 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
1 голос
/ 18 сентября 2008

Помните, что простое распаковывание ZIP-файла может привести к уязвимости безопасности .

...