【问题标题】:What is StringIO() used for in this script?此脚本中使用的 StringIO() 是什么?
【发布时间】:2012-01-19 18:27:14
【问题描述】:

我刚开始使用 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()

【问题讨论】:

  • 以后,请在您的问题中发布代码。 StackOverflow 让它变得简单易读。
  • StringIO 创建内存文件(与使用文件系统的open 创建的普通文件相反),因此您基本上是在内存中进行文件操作。

标签: python django frameworks stringio


【解决方案1】:

StringIO 是一个可以用作类文件对象的类。你可以像使用普通文件一样使用它,除了不是将数据写入磁盘,而是将其写入内存中的缓冲区(字符串缓冲区)。

在此脚本中,看起来图像首先保存到 StringIO 内存缓冲区,然后检索字符串的值并将其传递给 ContentFile 的构造函数以创建 ContentFile 的新实例,然后将其传递给字段保存功能。

我认为脚本使用 StringIO 的原因是 ContentFile 的构造函数接受一个字符串,写入然后读取 StringIO 文件是获取表示为字符串的图像内容的最简单方法。

顺便说一句,我建议你看一下Django's ImageFile字段类型,它对于我的图像相关需求已经绰绰有余,并且比通过StringIO和ContentFiles更清晰。

【讨论】:

  • 谢谢,我想我现在明白了作为缩略图。
【解决方案2】:

StringIO 提供了读取和写入字符串的能力,就像写入文件一样。这可以使编码更方便,更容易,或两者兼而有之。

它还允许您编辑字符串,这与常规的 Python 字符串不同。

【讨论】:

  • 我是从文档中得到的,但为什么在这里使用它?我根本不明白这个概念。什么实际上保存在 fp 中?路径还是二进制文件?为什么这里使用 stringio 而不是普通的字符串?
  • @user:图像已保存。但是它不是保存到文件中,而是保存到 stringIO 中,即在调用保存 stringIO 之后将包含图像的内容。作者没有使用字符串的原因是a)您不能写入字符串(字符串是只读的),因此 save 方法无法将图像的内容写入字符串参数并且b) 如果 save 得到一个字符串作为它的第一个参数,它会将它解释为一个文件名。
  • @JasonTS:它作为一个缓冲区很有用,你可以在其中对字符串做任何你想做的事情,这与普通的 python 字符串不同。
猜你喜欢
  • 2019-09-17
  • 1970-01-01
  • 2010-11-15
  • 2011-12-21
  • 2020-04-30
  • 2021-08-12
  • 1970-01-01
  • 2011-09-20
  • 2016-05-17
相关资源
最近更新 更多