我已经看到了这个问题的变体,但不是在这个确切的背景下。我所拥有的是一个名为100-Test.zip的文件,其中包含100个.jpg图像。我想在内存中打开此文件并处理每个执行PIL操作的文件。其余的代码已经编写完了,我只想集中精力从zip文件到第一个PIL图像。这是我从阅读其他问题时收集的建议现在看起来的代码,但它不起作用。你们可以看看并帮忙吗?
import zipfile
from StringIO import StringIO
from PIL import Image
imgzip = open('100-Test.zip', 'rb')
z = zipfile.ZipFile(imgzip)
data = z.read(z.namelist()[0])
dataEnc = StringIO(data)
img = Image.open(dataEnc)
print img
但是当我运行它时,我收到了这个错误:
IOError: cannot identify image file <StringIO.StringIO instance at
0x7f606ecffab8>
替代方案:我见过其他消息来源说使用它代替:
image_file = StringIO(open("test.jpg",'rb').read())
im = Image.open(image_file)
但问题是我没有打开文件,它已经在数据变量的内存中了。我也尝试过使用dataEnc = StringIO.read(data)
但是出现了这个错误:
TypeError: unbound method read() must be called with StringIO instance as
first argument (got str instance instead)
原来问题是namelist()中有一个额外的空元素,因为图片被压缩在zip文件中。这是完整的代码,将检查并迭代100个图像。
import zipfile
from StringIO import StringIO
from PIL import Image
import imghdr
imgzip = open('100-Test.zip')
zippedImgs = zipfile.ZipFile(imgzip)
for i in xrange(len(zippedImgs.namelist())):
print "iter", i, " ",
file_in_zip = zippedImgs.namelist()[i]
if (".jpg" in file_in_zip or ".JPG" in file_in_zip):
print "Found image: ", file_in_zip, " -- ",
data = zippedImgs.read(file_in_zip)
dataEnc = StringIO(data)
img = Image.open(dataEnc)
print img
else:
print ""
多谢你们!
我有同样的问题,感谢@alfredox,我修改了答案,在python3中使用io.BytesIO而不是StringIo。
z = zipfile.ZipFile(zip_file)
for i in range(len(z.namelist())):
file_in_zip = z.namelist()[i]
if (".jpg" in file_in_zip or ".JPG" in file_in_zip):
data = z.read(file_in_zip)
dataEnc = io.BytesIO(data)
img = Image.open(dataEnc)
print(img)