2013-10-15 82 views
28

如何从zip压缩文件中打开文件而不必先提取文件?python:从zip中打开文件,无需临时解压缩

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

+1

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

回答

41

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') 
... 

详细阅读zip文件文档here

+0

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

+0

您输入了什么代码才能得到该错误? – Jellema

+0

请解释你的改变。读取返回一个字符串与文件的内容;打开返回一个类似文件的对象。 pygame的文档说image.load需要一个文件名或类似文件的对象。 –

2

理论上,是的,这只是一个插件。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() 
9
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) 

我是想刚才算出这个为自己和想这可能对将来遇到此问题的任何人都有用。