Python:以zip格式打开文件,而无需临时提取文件


82

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

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


2
什么样的图像文件?GIF,JPEG和PNG已被压缩。
hughdbrown

Answers:


109

文森特·波维尔克(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文档。


image = pygame.image.load(imgfile,'img_01.png')TypeError:必须是不包含空字节的字符串,而不是str
user2880847 2013年

请说明您的更改。read返回一个包含文件内容的字符串;open返回一个类似文件的对象。pygame的文档说image.load需要一个文件名或类似文件的对象。
Esme Povirk

@Vincent Povirk:感谢您的评论。问题仍然是image.load确实接受类似文件的对象,但不接受zip-file-object。您必须以某种方式适应这种情况。我也不相信我的回答,还不够优雅……
Jellema

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)

我现在只是想自己解决这个问题,并认为这可能对将来遇到此问题的任何人有用。


8

从理论上讲,是的,这只是插入东西的问题。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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.