2011-12-13 7 views
1

私はちょうどDjangoとPythonを使い始めました。私は写真アプリを作ろうとしています。このスクリプトはサムネイルを生成しており、私はそれを自分でやってみたいと思います。残念ながら私はStringIO()が何をしているのか分かりません。その場合、Python Docsはあまり役に立ちません。このスクリプトではStringIO()は何のために使用されていますか?

この特定のケースでは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() 
+0

今後、質問にコードを投稿してください。 StackOverflowは簡単で読みやすいです。 – cheeken

+1

'StringIO'は(通常はファイルシステムを使用する' open'で作成された通常のファイルとは対照的に)メモリ内ファイルを作成します。したがって、基本的にメモリ内でファイル操作を行います。 – birryree

答えて

2

StringIOは、ファイルライクなオブジェクトとして使用できるクラスです。ディスクに書き込まれるデータの代わりに、メモリ内のバッファ(文字列バッファ)に書き込まれる点を除いて、通常のファイルとまったく同じように使用できます。

このスクリプトでは、イメージが最初にStringIOメモリバッファに保存された後、文字列の値が取得され、ContentFileのコンストラクタに渡されてContentFileの新しいインスタンスが作成され、渡されますフィールドセーブ機能に設定します。

私は、スクリプトがStringIOを使用している理由は、ContentFileのコンストラクタが文字列を取り、文字列として表される画像コンテンツを取得する最も簡単な方法だと考えています。

補足として、Django's ImageFileフィールドタイプを見て、私のイメージに関連したニーズに十分なものであり、StringIOとContentFilesよりもはっきりしていることをお勧めします。

+0

ありがとう、私は今私はそれを持っていると思う:)私は実際にイメージフィールドを使用するつもりですが、モデルを保存している間、第2の画像フィールドにサムネイルとして表示する。 – JasonTS

0

たStringIOは、1つのファイルに書き込むのと同じように文字列に読み書きする能力を提供します。これにより、コーディングがより便利に、より簡単に、またはその両方になる可能性があります。

また、通常のPython文字列とは異なり、文字列を編集することもできます。

+0

私はドキュメントからそれを得ましたが、なぜここでそれを使用していますか?私は概念を全く得ていない。実際にfpに保存されるのは何ですか?パスまたはバイナリファイル?通常の文字列の代わりにここでstringioが使用されるのはなぜですか? – JasonTS

+0

@user:画像が保存されます。ただし、ファイルに保存されるのではなく、文字列IOに保存されます。つまり、文字列IOを保存する呼び出しの後に画像の内容が含まれます。作者が文字列を使用しなかった理由は、a)文字列に書き込むことはできません(文字列は読み取り専用)ので、saveメソッドがイメージの内容を文字列引数に書き込むことはできません。 b)saveが最初の引数として文字列を取得した場合、その文字列をファイル名として解釈します。 – sepp2k

+0

@JasonTS:バッファーとして便利です。通常のPython文字列とは異なり、文字列に必要な処理を行うことができます。 – bcc32

関連する問題