2013-10-15 4 views
28

Wie kann ich Dateien aus einem Zip-Archiv öffnen, ohne sie zuerst zu extrahieren?Python: Datei aus Zip öffnen, ohne sie temporär zu extrahieren

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

+1

Welche Art von Bilddateien? GIF, JPEG und PNG sind bereits komprimiert. – hughdbrown

Antwort

41

Vincent Povirk's Antwort wird nicht vollständig funktionieren;

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

Sie haben es in sich ändern:

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

Einzelheiten lesen Sie die ZipFile docs here

+0

image = pygame.image.load (imgfile, 'img_01.png') TypeError: muss eine Zeichenkette ohne Null Bytes, keine Str sein – user2880847

+0

Welchen Code haben Sie genau eingegeben, um diesen Fehler zu bekommen? – Jellema

+0

Bitte erläutern Sie Ihre Änderung. Lesen gibt eine Zeichenfolge mit dem Inhalt der Datei zurück; open gibt ein dateiähnliches Objekt zurück. Die Dokumentation von pygame besagt, dass image.load einen Dateinamen oder ein dateiähnliches Objekt benötigt. –

2

In der Theorie, ja, es ist nur eine Sache der Dinge einstecken. Zipfile können Sie eine Datei-ähnliche Objekt für eine Datei in einem Zip-Archiv, und Image.load wird eine Datei-wie akzeptieren Objekt. So etwas wie das 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() 
9
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 versucht, dies für mich gerade jetzt, um herauszufinden, und dachte, das könnte nützlich für jeden, der in Zukunft auf diese Frage stößt.