Python: bestand openen in zip zonder het tijdelijk uit te pakken

Hoe kan ik bestanden in een zip-archief openen zonder ze eerst uit te pakken?

Ik gebruik pygame. Om schijfruimte te besparen, heb ik alle afbeeldingen gecomprimeerd.
Is het mogelijk om een bepaalde afbeelding rechtstreeks uit het zip-bestand te laden?
Bijvoorbeeld:
pygame.image.load('zipFile/img_01')


Antwoord 1, autoriteit 100%

Vincent Povirk’s antwoord zal niet helemaal werken;

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

Je moet het wijzigen in:

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

Lees voor details de ZipFile-documenten hier.


Antwoord 2, autoriteit 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)

Ik probeerde dit zojuist voor mezelf uit te zoeken en dacht dat dit nuttig zou kunnen zijn voor iedereen die deze vraag in de toekomst tegenkomt.


Antwoord 3, autoriteit 9%

In theorie, ja, het is gewoon een kwestie van dingen inpluggen. Zipfile kan je een bestand-achtig object geven voor een bestand in een zip-archief, en image.load zal een bestand-achtig object accepteren. Dus zoiets als dit zou moeten werken:

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()

Other episodes