python:从zip打开文件而不临时解压缩

use*_*847 60 python zipfile

如何从zip存档中打开文件而不先解压缩?

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

Jel*_*ema 77

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

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgfile = archive.open('img_01.png')
...
Run Code Online (Sandbox Code Playgroud)

你必须改变它:

import zipfile
archive = zipfile.ZipFile('images.zip', 'r')
imgdata = archive.read('img_01.png')
...
Run Code Online (Sandbox Code Playgroud)

有关详细信息读取zip文件的文档在这里

  • 请解释您的更改。read 返回一个包含文件内容的字符串;open 返回一个类似文件的对象。pygame 的文档说 image.load 需要一个文件名或类似文件的对象。 (3认同)

np8*_*np8 23

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

Run Code Online (Sandbox Code Playgroud)

文档链接


小智 17

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)
Run Code Online (Sandbox Code Playgroud)

我现在正试图为自己解决这个问题,并认为这可能对将来遇到这个问题的人有用.


Vin*_*irk 7

从理论上讲,是的,这只是插入内容的问题。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()
Run Code Online (Sandbox Code Playgroud)