146 votes

Python: Ouvrir un fichier dans une archive zip sans l'extraire temporairement

Comment puis-je ouvrir des fichiers dans une archive zip sans les extraire d'abord ?

Je suis en train d'utiliser pygame. Pour économiser de l'espace disque, j'ai tous les fichiers images zippés. Est-il possible de charger une image donnée directement depuis le fichier zip ? Par exemple : pygame.image.load('zipFile/img_01')

179voto

Jellema Points 1444

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 modifier en :

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

Pour plus de détails, consultez la documentation de ZipFile ici.

34voto

Brandon Points 341
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)

Je suis en train d'essayer de comprendre cela pour moi-même en ce moment et j'ai pensé que cela pourrait être utile pour quiconque tombe sur cette question à l'avenir.

27voto

np8 Points 1538

À partir de Python 3.2, il a été possible d'utiliser le ZipFile en tant que gestionnaire de contexte :

from zipfile import ZipFile

with ZipFile('images.zip') as zf:
    for file in zf.namelist():
        if not file.endswith('.png'): # filtrage facultatif par type de fichier
            continue
        with zf.open(file) as f:
            image = pygame.image.load(f, namehint=file)
  • L'avantage d'utiliser des gestionnaires de contexte (déclaration with) est que les fichiers se ferment automatiquement correctement.
  • Le f peut être utilisé comme un objet de fichier régulier que vous obtiendriez en utilisant la fonction intégrée open().

Liens vers la documentation

15voto

Vincent Povirk Points 1487

En théorie, oui, il suffit simplement de brancher les choses. 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 ceci devrait fonctionner :

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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X