我可以使用PIL / Pillow在zip中打开图像而不先将其提取到磁盘吗?
答案 0 :(得分:8)
最近的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()))
答案 1 :(得分:2)
Pythons zipfile确实提供了一个ZipFile.open()
,它为zip中的文件返回一个文件对象,Pillow的Image.open()
可以从中打开文件对象。遗憾的是,zipfile对象不提供seek()
所需的Image.open()
方法。
而是将图像文件读入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)