私は異なる出力を得るように見える:バイナリファイルのStringIO?
from StringIO import *
file = open('1.bmp', 'r')
print file.read(), '\n'
print StringIO(file.read()).getvalue()
なぜ?それはStringIOがテキスト文字列または何かしかサポートしないからですか?
私は異なる出力を得るように見える:バイナリファイルのStringIO?
from StringIO import *
file = open('1.bmp', 'r')
print file.read(), '\n'
print StringIO(file.read()).getvalue()
なぜ?それはStringIOがテキスト文字列または何かしかサポートしないからですか?
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')
:私はバイナリモードでバイナリファイルを開くことをお勧めします、余談として
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"
を使用して開くべきではありませんか?
いくつかのプラットフォーム(そしてPython 3のどこでも)では 'r'はバイナリモードを意味します。また、あなたの投稿にタグラインや署名を追加しないでください。 – agf
第2のfile.read()
は、実際には空の文字列を返します。内部ファイルのオフセットを巻き戻すには、file.seek(0)
を実行する必要があります。
そのコードでは、2番目のfile.read()は何も取得しません。ファイルを再度読み取る前に、seek(0)を使用する必要があります。 –