对于包含大量图片的大型zip文件而言,解压非常费时间,同时解压过程也会需要更大的硬盘空间。这个时候,如果Python能直接读取到zip中的图片的话,就非常有用了。

本文提供PIL和cv2两种格式的图片读取。代码为本人原创,有问题可留言交流~

这里用到的包是zipfile。假设有个zip文件叫“demo.zip”,其中包含"sing.jpg"、“dance.jpg”、"rap.jpg"和"basketball.jpg"四张图片。

from zipfile import ZipFile
from io import BytesIO
from PIL import Image
import cv2

zip_file = 'demo.zip'
zo = ZipFile(zip_file, 'r')
print(zo.namelist())  # ['basketball.jpg', 'dance.jpg', 'rap.jpg','sing.jpg']

index = 0 # select image by index
img_name = zo.namelist()[index]  # 'basketball.jpg'

img = Image.open(BytesIO(zo.read(img_name)))
print(img.size)   # (256, 256)
img.save('imgs/basketball.jpg')

img_cv2 = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
print(img_cv2.shape)   # (256, 256, 3)
cv2.imwrite('imgs/basketball_cv2.jpg', img_cv2)

这里用到一个字节流BytesIO,承接住zipfile读出的字节流。PIL.Image则可以直接读这个BytesIO字节流,将字节流转成图片就可以保存了。


扩展:如果抽取通用类数据(不限于图片)

from zipfile import ZipFile

zip_file = 'demo.zip'
save_folder = 'demo/'
zo = ZipFile(zip_file, 'r')
print(zo.namelist())  # ['basketball.txt', 'dance.pdf', 'rap.jpg','sing.avi']

index = 0 # select image by index
content = zo.namelist()[index]  # 'basketball.txt'
zo.extract(content, osp.join(save_folder, content))

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐