2011-11-03 4 views
58

私はプロではなく、StringIOが正確に何のために使われているかを理解する上で頭を悩ましてきました。私はいくつかの例のためにインターネットの周りを見てきました。しかし、ほとんどの例は非常に抽象的です。そして、彼らは単にそれを使う方法を示します。しかし、それらのどれも「なぜ」と「どのような状況で」それを使用すべき/使用しないのかを示していないのですか? ありがとうございます。PythonのStringIOは実際に何のために使用されていますか?

P.s.いいえ、stackoverflowでこの質問と混同しないでください:StringIO Usage stringとStringIoを比較します。

答えて

75

ファイルを受け取るだけの文字列を使用するAPIがある場合に使用されます。あなたはファイルのような役割を果たしたファイルのようなオブジェクトが必要な場合には

import gzip 
import StringIO 

stringio = StringIO.StringIO() 
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w') 
gzip_file.write('Hello World') 
gzip_file.close() 

stringio.getvalue() 
+0

「duck typing」:D – Abdelouahab

+1

Python 3.2以降、gzipモジュールにはデータを直接圧縮する機能があります。 (しかし、現在StringIOを必要としているオープンソースのライブラリであれば、たぶんこのような関数を増やすだろうから、新しい例を探すのではなく、ここでgzipを残しておきます) –

27

StringIOは文字列にファイルのようなアクセスを与えます。したがって、ファイルを扱い、ほとんど何も変更せずに文字列で動作させる既存のモジュールを使用できます。

たとえば、ファイルに書き込みを行うロガーがあり、代わりにネットワーク経由でログ出力を送信するとします。ファイルを読み込んでその内容をネットワークに書き込むこともできますし、ファイルシステムに触れることなく、ログをStringIOオブジェクトに書き込んでネットワーク宛先に送信することもできます。 StringIOを使用すると、最初の方法で簡単に2番目の方法に切り替えることができます。

12

が、メモリ内の文字列バッファに書き込んでいる:例えば、Pythonの2にgzipモジュールを使用して文字列を圧縮するたStringIOをツールです。プレーンテキストドキュメントなどの大きな文字列を作成していて文字列の連結を大量に行う場合は、mystr += 'more stuff\n'の操作の代わりにStringIOを使用するほうが簡単です。

+1

私は 'StringIO'を特に、io.StringIOの代わりに 'cStringIO.StringIO'を使うことができる場合は、' mystr + = "より多くのstuff \ n" 'のループ内の文字データと比較して、複数のメガバイトの文字データを扱う場合はかなり高速です'。 – SeldomNeedy

8

私は個人のためにそれを使用している物事のカップル:

  1. 全体のファイルのキャッシュ。私は、PDFを読んで、それらについて様々なことを検証するスクリプトを持っています。私が使用しているPDFライブラリは、その文書コンストラクタで開いているファイルを取ります。私はもともとPDFを開いたばかりでしたが、読んで興味があったのですが、ファイル全体を一度にメモリに読み込んでからPDFライブラリにStringIOオブジェクトを渡すと、スクリプトの実行時間は半分になりました。

  2. 遅延印刷。同じスクリプトは、読み込むすべてのPDFの前にヘッダーを印刷します。ただし、構成ファイルに含まれている特定のテストを無視するか、特定のテストのみを含めるかをコマンドラインで指定できます。私が無視した場合すべては特定のPDFをテストしますが、ヘッダーは表示されませんが、テストの実行が完了するまでテストの実行回数はわかりません。だから私はそれを指すようにsys.stdoutを変更することによってStringIOオブジェクトにヘッダーをキャプチャし、テストを実行するたびに、そのオブジェクトに何かがあるかどうかをチェックします。もしそうなら、それを印刷して空にリセットします。テストがあるPDFのみヘッダーが印刷されています。

7

私はちょうど2つの事のために、実際にはStringIOを使用しました:簡単な分析のためStringIOインスタンスにsys.stdoutをリダイレクトすることによって、print INGの多くを行うユニットテストスクリプトに

  • ElementTreeを使用して保証型のXML文書(カスタムAPI要求)を作成し、次にwriteを使用してHTTP接続経由で送信する。

あなたはしばしばStringIOを必要としないことが、時にはそれはかなり便利です。

0

Djangoには、管理コマンドを呼び出すための機能call_commandがあります。この関数は、出力をstdoutに出力し、値を返しません。コマンドが正常に実行されたかどうかを知りたければ、出力を調べて決定する必要があります。

StringIOを使用すると、出力をキャプチャして、出力が望ましいかどうかを確認できます。

with io.StringIO() as output: 
    call_command('custom_command', stdout=output) 
    if 'Success' not in output.getvalue(): 
     print('Custom command failed...') 
関連する問題