python PIL图像如何将图像保存到缓冲区以便以后使用?

python PIL图像如何将图像保存到缓冲区以便以后使用?,python,io,gridfs,stringio,Python,Io,Gridfs,Stringio,我有一个png文件,应该转换成jpg并保存到gridfs,我使用python的PILlib加载文件并进行转换工作,问题是我想将转换后的图像存储到MongoDB gridfs,在保存过程中,我不能只使用im.save()方法。因此,我使用StringIO来保存临时文件,但它不起作用 以下是代码片段: #!/usr/bin/env python # -*- coding: utf-8 -*- from PIL import Image from pymongo import MongoClient

我有一个
png
文件,应该转换成
jpg
并保存到
gridfs
,我使用python的
PIL
lib加载文件并进行转换工作,问题是我想将转换后的图像存储到MongoDB gridfs,在保存过程中,我不能只使用
im.save()
方法。因此,我使用
StringIO
来保存临时文件,但它不起作用

以下是代码片段:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PIL import Image
from pymongo import MongoClient
import gridfs
from StringIO import StringIO


im = Image.open("test.png").convert("RGB")

#this is what I tried, define a 
#fake_file with StringIO that stored the image temporarily.
fake_file = StringIO()
im.save(fake_file,"jpeg")

fs = gridfs.GridFS(MongoClient("localhost").stroage)

with fs.new_file(filename="test.png") as fp:
    # this will not work
    fp.write(fake_file.read())


# vim:ai:et:sts=4:sw=4:
我对python的
IO
机制非常熟悉,如何使其工作?

使用而不是
读取

with fs.new_file(filename="test.png") as fp:
    fp.write(fake_file.getvalue())
或者,您可以使用if从StringIO的开头开始阅读

with fs.new_file(filename="test.png") as fp:
    fake_file.seek(0)
    fp.write(fake_file.read())

谢谢,这很有效,但是为什么我要先
seek(0)
才能
read()
工作呢?这很让人困惑,也很奇怪。我在《我在哪里可以了解更多关于
StringIO
read()
方法的行为?
StringIO
read()方法的行为?
StringIO
被明确设计为类似于文件。您刚刚完成对“文件”的写入,因此文件指针位于“文件”的末尾。所以阅读不会得到任何东西,因为你在“文件”的末尾。这就是为什么你必须
seek(0)
来阅读它。因为它就像一个文件。“它的工作原理与您期望的一样”。@armnotstrong:链接中的第二句话。在这里,您可以找到与文件对象共享的所有方法
StringIO
。@unutbu+1用于
.seek(0)
提示。对我来说,需要用PIL做
Image.open(假文件)