2013-10-15 13 views
28

Jak mogę otworzyć pliki z archiwum zip bez ich wcześniejszego wyodrębniania?python: Otwórz plik zip bez tymczasowego wypakowania go

Używam pygame. Aby zaoszczędzić miejsce na dysku, wszystkie obrazy zostały zipowane. Czy można załadować dany obraz bezpośrednio z pliku zip? Na przykład: pygame.image.load('zipFile/img_01')

+1

Jakie rodzaje plików graficznych? GIF, JPEG i PNG są już skompresowane. – hughdbrown

Odpowiedz

41

Odpowiedź Vincenta Povirka nie zadziała całkowicie;

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

Trzeba ją zmienić w:

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

Szczegółowe przeczytać docs zipfile here

+0

image = pygame.image.load (imgfile, 'img_01.png') TypeError: musi być łańcuchem bez zerowych bajtów, a nie str – user2880847

+0

Jaki kod wpisałeś dokładnie, aby uzyskać ten błąd? – Jellema

+0

Proszę wyjaśnij swoją zmianę. read zwraca ciąg znaków z zawartością pliku; open zwraca obiekt podobny do pliku. Dokumentacja pygame mówi, że image.load chce nazwy pliku lub obiektu podobnego do pliku. –

2

Teoretycznie, tak, to tylko kwestia podłączania rzeczy. Zipfile może dać obiekt podobny do pliku dla pliku w archiwum zip, a image.load zaakceptuje plik podobny do obiekt. Tak więc coś takiego powinno zadziałać:

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) 

starałem się rysunek to dla mnie właśnie teraz i myślę, może to Przydadzą się każdemu, kto przejdzie to pytanie w przyszłości.

Powiązane problemy