104

如何在不先解压缩的情况下打开 zip 存档中的文件?

我正在使用pygame。为了节省磁盘空间,我将所有图像都压缩了。是否可以直接从 zip 文件加载给定的图像?例如: pygame.image.load('zipFile/img_01')

4

4 回答 4

142

Vincent Povirk 的回答不会完全奏效;

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

你必须改变它:

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

有关详细信息,请阅读此处ZipFile的文档。

于 2013-10-15T01:52:20.583 回答
30
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)

我刚刚试图为自己解决这个问题,并认为这对将来遇到这个问题的任何人都有用。

于 2014-01-27T17:26:02.980 回答
11

从理论上讲,是的,这只是插入东西的问题。Zipfile 可以为您提供一个类似文件的对象,用于 zip 存档中的文件,而 image.load 将接受一个类似文件的对象。所以这样的事情应该有效:

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()
于 2013-10-15T01:36:27.833 回答
1

从 Python 3.2 开始,可以将ZipFile用作上下文管理器:

from zipfile import ZipFile

with ZipFile('images.zip') as zf:
    for file in zf.namelist():
        if not file.endswith('.png'): # optional filtering by filetype
            continue
        with zf.open(file) as f:
            image = pygame.image.load(f, namehint=file)

  • 使用上下文管理器(with语句)的好处是文件会自动正确关闭。
  • f可以像使用内置open()时获得的常规文件对象一样使用。

文档链接

于 2022-01-14T17:14:29.040 回答