web-dev-qa-db-fra.com

Python: Ouvrir un fichier à partir de Zip sans l'extraire temporairement

Comment puis-je ouvrir des fichiers depuis une archive Zip sans les extraire au préalable?

J'utilise pygame. Pour économiser de l'espace disque, j'ai compressé toutes les images. Est-il possible de charger une image donnée directement à partir du fichier Zip? Par exemple: pygame.image.load('zipFile/img_01')

56
user2880847

La réponse de Vincent Povirk ne fonctionnera pas complètement.

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

Vous devez le changer en:

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

Pour plus de détails, lisez la ZipFile docs ici .

73
Jellema
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)

J'essayais de comprendre cela moi-même tout à l'heure et je pensais que cela pourrait être utile à quiconque se heurterait à cette question à l'avenir.

16
Brandon

En théorie, oui, il suffit simplement de brancher des objets. Zipfile peut vous donner un objet de type fichier pour un fichier dans une archive Zip, et image.load acceptera un objet de type fichier. Donc, quelque chose comme ça devrait marcher:

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()
6
Vincent Povirk