【发布时间】:2015-10-16 08:57:50
【问题描述】:
我可以使用 PIL/Pillow 打开 zip 内的图像而不先将其解压缩到磁盘吗?
【问题讨论】:
标签: python python-imaging-library zipfile pillow
我可以使用 PIL/Pillow 打开 zip 内的图像而不先将其解压缩到磁盘吗?
【问题讨论】:
标签: python python-imaging-library zipfile pillow
最近的 Pillow 版本不需要.seek():
#!/usr/bin/env python
import sys
from zipfile import ZipFile
from PIL import Image # $ pip install pillow
filename = sys.argv[1]
with ZipFile(filename) as archive:
for entry in archive.infolist():
with archive.open(entry) as file:
img = Image.open(file)
print(img.size, img.mode, len(img.getdata()))
【讨论】:
Pythons zipfile 确实提供了一个 ZipFile.open(),它为 zip 中的文件返回一个文件对象,Pillow 的 Image.open() 可以使用文件对象打开。不幸的是,zipfile 对象没有提供Image.open() 需要的seek() 方法。
而是将图像文件读入RAM中的字符串(如果不是太大),并使用StringIO获取Image.open()的文件对象:
from zipfile import ZipFile
from PIL import Image
from StringIO import StringIO
archive = ZipFile("file.zip", 'r')
image_data = archive.read("image.png")
fh = StringIO(image_data)
img = Image.open(fh)
【讨论】:
io.BytesIO而不是StringIO可能会更好,尽管在这种情况下两者似乎都有效。