Как мне прочитать выбранные файлы из удаленного Zip-архива по протоколу HTTP с помощью Python?

StackOverflow https://stackoverflow.com/questions/94490

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Вот как я это сделал (захватывая все файлы, заканчивающиеся на ".rankes"):

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top