这个脚本中StringIO()的用途是什么?
我刚开始使用Django和Python,想要制作一个照片应用。这个脚本可以生成缩略图,我也想自己来做。不过,我不太明白StringIO()
到底是干什么的。Python的文档对我来说也不是很有帮助。
有人能给我解释一下在这个特定情况下StringIO()
是做什么的吗?
来自 http://djangosnippets.org/snippets/1172/:
def save(self):
from PIL import Image
#Original photo
imgFile = Image.open(self.image.path)
#Convert to RGB
if imgFile.mode not in ('L', 'RGB'):
imgFile = imgFile.convert('RGB')
#Save a thumbnail for each of the given dimensions
#The IMAGE_SIZES looks like:
#IMAGE_SIZES = { 'image_web' : (300, 348),
# 'image_large' : (600, 450),
# 'image_thumb' : (200, 200) }
#each of which corresponds to an ImageField of the same name
for field_name, size in self.IMAGE_SIZES.iteritems():
field = getattr(self, field_name)
working = imgFile.copy()
working.thumbnail(size, Image.ANTIALIAS)
fp = StringIO()
working.save(fp, "JPEG", quality=95)
cf = ContentFile(fp.getvalue())
field.save(name=self.image.name, content=cf, save=False);
#Save instance of Photo
super(Photo, self).save()
2 个回答
0
StringIO就像一个可以读写字符串的文件,让你可以像写文件一样去处理字符串。这会让编程变得更方便、更简单,或者两者兼而有之。
它还允许你编辑字符串,这点和普通的Python字符串不同。
2
StringIO 是一个可以像文件一样使用的类。你可以像使用普通文件那样使用它,只不过数据不是写入硬盘,而是写入内存中的一个缓冲区(也就是一个字符串缓冲区)。
在这个脚本中,图像首先被保存到一个 StringIO 的内存缓冲区中,然后再获取这个字符串的值,并传递给 ContentFile 的构造函数,以创建一个新的 ContentFile 实例,最后这个实例被传递给字段保存函数。
我猜测这个脚本使用 StringIO 的原因是因为 ContentFile 的构造函数需要一个字符串,而写入和读取 StringIO 文件是将图像内容表示为字符串的最简单方法。
顺便提一下,我建议你看看 Django 的 ImageFile 字段类型,它已经足够满足我对图像的需求,而且比通过 StringIO 和 ContentFiles 更清晰。