Python: Öffnen Sie die Datei in zip, ohne sie vorübergehend zu extrahieren

82

Wie kann ich Dateien in einem Zip-Archiv öffnen, ohne sie zuerst zu extrahieren?

Ich benutze Pygame. Um Speicherplatz zu sparen, habe ich alle Bilder komprimiert. Ist es möglich, ein bestimmtes Bild direkt aus der Zip-Datei zu laden? Zum Beispiel: pygame.image.load('zipFile/img_01')

user2880847
quelle
2
Welche Art von Bilddateien? GIF, JPEG und PNG sind bereits komprimiert.
Hughdbrown

Antworten:

109

Die Antwort von Vincent Povirk wird nicht vollständig funktionieren.

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

Sie müssen es ändern in:

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

Für Details lesen Sie die ZipFileDokumente hier .

Jellema
quelle
image = pygame.image.load (imgfile, 'img_01.png') TypeError: muss ein String ohne Null-Bytes sein, nicht str
user2880847
Bitte erläutern Sie Ihre Änderung. read gibt eine Zeichenfolge mit dem Inhalt der Datei zurück; open gibt ein dateiähnliches Objekt zurück. In der Dokumentation von pygame heißt es, image.load möchte einen Dateinamen oder ein dateiähnliches Objekt.
Esme Povirk
@ Vincent Povirk: Danke für den Kommentar. Das Problem bleibt, dass image.load ein dateiähnliches Objekt akzeptiert, das zip-file-Objekt jedoch nicht. Daran muss man sich irgendwie anpassen. Ich bin auch nicht von meiner Antwort überzeugt, sie ist noch nicht elegant ...
Jellema
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)

Ich habe gerade versucht, dies für mich selbst herauszufinden, und dachte, dies könnte für jeden nützlich sein, der in Zukunft auf diese Frage stößt.

Brandon
quelle
8

Theoretisch ist es nur eine Frage des Einsteckens. Mit Zipfile können Sie ein dateiähnliches Objekt für eine Datei in einem Zip-Archiv erhalten, und image.load akzeptiert ein dateiähnliches Objekt. So etwas sollte funktionieren:

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()
Esme Povirk
quelle