Как мне прочитать выбранные файлы из удаленного Zip-архива по протоколу HTTP с помощью Python?
Вопрос
Мне нужно прочитать выбранные файлы, совпадающие по имени файла, из удаленного 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-файла!
Имейте в виду, что простая распаковка ZIP-файла может привести к уязвимость в системе безопасности.