【发布时间】:2015-08-02 22:15:55
【问题描述】:
我看到了这个问题的变体,但不是在这个确切的上下文中。我拥有的是一个名为 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)
【问题讨论】:
-
你的第一个例子对我来说很好,你也可以
z = zipfile.ZipFile('100-Test.zip') -
@alfredox 你检查过
z.namelist()[0]是否是一个图像文件吗? -
@PadraicCunningham 所以您没有对代码进行任何更改并且它有效吗?我不确定我错过了什么,因为我收到了这些错误。
-
@ozgur 我只是假设它包含 zipfile 中的第一个文件,我不知道如何测试这是一个图像。
-
是的,正如@ozgur 暗示的那样,问题可能是压缩文件中的第一项不是有效的图像文件(或者至少你的 PIL 不知道如何解码)。只需打印
z.namelist即可让您了解您实际打开的是哪个文件
标签: python io buffer python-imaging-library zipfile