2013-10-15 7 views
28

Come posso aprire i file da un archivio zip senza estrarli prima?python: Apri il file da zip senza estrarlo temporaneamente

Sto usando pygame. Per risparmiare spazio sul disco, ho tutte le immagini azzerate. È possibile caricare una determinata immagine direttamente dal file zip? Ad esempio: pygame.image.load('zipFile/img_01')

+1

Che tipo di file di immagine? GIF, JPEG e PNG sono già compressi. – hughdbrown

risposta

41

La risposta di Vincent Povirk non funzionerà completamente;

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

Dovete cambiare in:

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

Per i dettagli leggere la documentazione ZipFile here

+0

image = pygame.image.load (imgfile, 'img_01.png') TypeError: deve essere una stringa senza byte null, non str – user2880847

+0

Quale codice hai digitato esattamente per ottenere quell'errore? – Jellema

+0

Per favore spiega la tua modifica. read restituisce una stringa con il contenuto del file; open restituisce un oggetto simile a un file. la documentazione di pygame dice che image.load vuole un nome file o un oggetto simile a un file. –

2

In teoria, si, è solo una questione di collegare le cose. Zipfile può darti un oggetto simile a un file per un file in un archivio zip, e image.load accetterà un file come oggetto. Quindi qualcosa del genere dovrebbe funzionare:

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) 

stavo cercando di capire questo per me solo ora e pensato che questo potrebbe essere utile per chiunque incontri questa domanda in futuro.