2011-09-26 5 views
5

私は異なる出力を得るように見える:バイナリファイルのStringIO?

from StringIO import * 

file = open('1.bmp', 'r') 

print file.read(), '\n' 
print StringIO(file.read()).getvalue() 

なぜ?それはStringIOがテキスト文字列または何かしかサポートしないからですか?

+2

そのコードでは、2番目のfile.read()は何も取得しません。ファイルを再度読み取る前に、seek(0)を使用する必要があります。 –

答えて

8

file.read()に電話すると、ファイル全体がメモリに読み込まれます。その後、同じファイルオブジェクトに対してfile.read()を再度呼び出すと、すでにファイルの最後に達しているため、空の文字列だけが返されます。

代わりに、ファイルを再度開く:

from StringIO import * 

file = open('1.bmp', 'r') 
print file.read(), '\n' 
file.close() 

file2 = open('1.bmp', 'r') 
print StringIO(file2.read()).getvalue() 
file2.close() 

また、そのコードのクリーンにするためにwithステートメントを使用することができます:open('1.bmp', 'rb')

+0

はい、そうです。それは私の現実の世界の問題を完全には解決しませんでした。そして、私は 'w'モードでデータを書いていて、 'wb'ではなく破損したファイルを取得していることに気付きました。今すぐすべてが動作します:) – Joelmc

+0

minheeによって提案されたfile.seek(0)ははるかに良いアプローチだと思います。 – Gallaecio

-1

:私はバイナリモードでバイナリファイルを開くことをお勧めします、余談として

from StringIO import * 

with open('1.bmp', 'r') as file: 
    print file.read(), '\n' 

with open('1.bmp', 'r') as file2: 
    print StringIO(file2.read()).getvalue() 

をこのモードでは、ASCII文字とEOFだけを処理することを前提としているので、"r"の代わりに"rb"を使用して開くべきではありませんか?

+0

いくつかのプラットフォーム(そしてPython 3のどこでも)では 'r'はバイナリモードを意味します。また、あなたの投稿にタグラインや署名を追加しないでください。 – agf

5

第2のfile.read()は、実際には空の文字列を返します。内部ファイルのオフセットを巻き戻すには、file.seek(0)を実行する必要があります。

関連する問題