这个脚本中StringIO()的用途是什么?

1 投票
2 回答
834 浏览
提问于 2025-04-17 08:20

我刚开始使用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 更清晰。

撰写回答