Python: Dosyayı geçici olarak çıkarmadan zip biçiminde açın


84

Önce çıkarmadan bir zip arşivindeki dosyaları nasıl açabilirim?

Pygame kullanıyorum. Disk alanından tasarruf etmek için tüm resimleri sıkıştırdım. Belirli bir resmi doğrudan zip dosyasından yüklemek mümkün mü? Örneğin: pygame.image.load('zipFile/img_01')


2
Ne tür görüntü dosyaları? GIF, JPEG ve PNG zaten sıkıştırılmıştır.
hughdbrown

Yanıtlar:


114

Vincent Povirk'ün cevabı tamamen işe yaramayacak;

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

Değiştirmek zorundasın:

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

Detaylar için okunan ZipFilebelgeler burada .


image = pygame.image.load (imgfile, 'img_01.png') TypeError: boş bayt içermeyen bir dize olmalı, str değil
user2880847

Lütfen değişikliğinizi açıklayın. read dosyanın içeriğini içeren bir dize döndürür; open, dosya benzeri bir nesne döndürür. pygame'in belgeleri, image.load'un bir dosya adı veya dosya benzeri bir nesne istediğini söylüyor.
Esme Povirk

@Vincent Povirk: Yorum yaptığınız için teşekkürler. Sorun, image.load'un dosya benzeri bir nesneyi kabul etmesi, ancak zip dosyası nesnesini kabul etmemesidir. Buna bir şekilde adapte olmalısın.
Cevabımdan

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)

Şu anda bunu kendim için anlamaya çalışıyordum ve bunun gelecekte bu soruyla karşılaşan herkes için yararlı olabileceğini düşündüm.


8

Teorik olarak, evet, bu sadece bir şeyler eklemek meselesidir. Zipfile size bir zip arşivindeki bir dosya için dosya benzeri bir nesne verebilir ve image.load dosya benzeri bir nesneyi kabul eder. Yani bunun gibi bir şey çalışmalı:

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.