web-dev-qa-db-ja.com

BytesIOオブジェクトをファイルに書き込む、「効率的に」

したがって、BytesIOオブジェクトをファイルに書き込む簡単な方法は、以下を使用することです。

with open('myfile.ext', 'wb') as f:
    f.write(myBytesIOObj.getvalue())
myBytesIOObj.close()

ただし、1つのチャンクに書き込むのではなく、myBytesIOObjを反復処理したい場合は、どうすればよいですか?私はPython 2.7.1を使用しています。また、BytesIOが巨大である場合、それは反復による書き込みのより効率的な方法でしょうか?

ありがとう

18
Kalabaaz

shutilには、ファイルを効率的に書き込むユーティリティがあります。チャンクでコピーし、デフォルトは16Kです。 4Kチャンクの倍数は、適切なクロスプラットフォーム番号である必要があります。実際にはファイルはOSキャッシュのRAMに書き込まれてからディスクに移動するため、チャンクサイズはそれほど大きな問題ではないため、131072を任意に選択しました。

import shutil

myBytesIOObj.seek(0)
with open('myfile.ext', 'wb') as f:
    shutil.copyfileobj(myBytesIOObj, f, length=131072)

ところで、最後にファイルオブジェクトを閉じる必要はありませんでした。 withはスコープを定義し、ファイルオブジェクトはそのスコープ内で定義されます。したがって、ファイルハンドルは、withブロックの終了時に自動的に閉じられます。

23
tdelaney