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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
10
0
4 134
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вот как я это сделал (захватил все файлы, заканчивающиеся на ".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.

Jim 18.09.2008 21:08

Почему вы не используете ZipFile(urllib2.urlopen(url))?

jfs 18.09.2008 21:39

Я пробовал это, но не смог заставить его работать, потому что, хотя это был объект, подобный файлу, он не поддерживал конкретную функцию, в которой нуждался Zipfile. Вот почему я добавил его в буфер cStringIO.

Marcel Levy 18.09.2008 21:43

Каталог для zip-файла хранится в конце, поэтому весь файл должен быть загружен перед извлечением, будь то в память или на диск.

Ignacio Vazquez-Abrams 10.01.2009 03:56

Не так уж и сложно создать свой собственный файловый объект, чтобы обернуть URL-адрес, чтобы вам не нужно было загружать все это: stackoverflow.com/questions/7829311/…

retracile 21.10.2011 20:23

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

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

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