Python: Відкрийте файл в архіві zip, тимчасово не витягуючи його


84

Як я можу відкрити файли в архіві zip, не витягуючи їх спочатку?

Я використовую пігаме. Щоб заощадити місце на диску, у мене всі зображення заархівовано. Чи можна завантажити дане зображення безпосередньо з zip-файлу? Наприклад: pygame.image.load('zipFile/img_01')


2
Що за файли зображень? GIF, JPEG та PNG вже стиснуті.
hughdbrown

Відповіді:


114

Відповідь Вінсента Повірка не спрацює повністю;

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgfile = archive.open('img_01.png')
...

Ви повинні змінити це в:

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgdata = archive.read('img_01.png')
...

Для отримання додаткової інформації прочитайте ZipFileдокументацію тут .


image = pygame.image.load (imgfile, 'img_01.png') TypeError: має бути рядок без нульових байт, а не str
user2880847

Поясніть, будь ласка, ваші зміни. read повертає рядок із вмістом файлу; open повертає файлоподібний об'єкт. Документація pygame говорить, що image.load хоче ім'я файлу або подібний до файлу об'єкт.
Есме Повірк

@ Вінсент Повірк: Дякую за коментар. Проблема залишається в тому, що image.load дійсно приймає подібний до файлу об’єкт, але не приймає zip-файл-об’єкт. До цього треба якось пристосуватися. Я теж не переконана у своїй відповіді, це ще не елегантно ...
Джеллема

21
import io, pygame, zipfile
archive = zipfile.ZipFile('images.zip', 'r')

# read bytes from archive
img_data = archive.read('img_01.png')

# create a pygame-compatible file-like object from the bytes
bytes_io = io.BytesIO(img_data)

img = pygame.image.load(bytes_io)

Я намагався зрозуміти це для себе зараз, і думав, що це може бути корисним для тих, хто стикається з цим питанням у майбутньому.


8

Теоретично, так, справа лише в тому, щоб підключити речі. Zipfile може дати вам подібний до файлу об’єкт для файлу в архіві zip, і image.load прийме подібний до файлу об’єкт. Отже, щось подібне повинно працювати:

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgfile = archive.open('img_01.png')
try:
    image = pygame.image.load(imgfile, 'img_01.png')
finally:
    imgfile.close()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.