複数の zip ファイルを作成する際に、BytesIO ストリームにコンテキスト マネージャーを使用しようとしています。最初の zip ファイルが書き込まれた後に BytesIO オブジェクトを「リセット」する方法が見つからないため、同じ BytesIO オブジェクトを使用して次の zip ファイルを作成できます。ディスクに書き込まれた後に 2 番目の zip ファイルを開こうとすると、常に「ファイルをアーカイブとして開けません」というエラーが表示されます。最初のzipファイルは問題なく開きます。検索しましたが、解決策が見つかりません。モードを書き込みから追加に変更しても、どちらも役に立ちませんでした。もちろん、新しい BytesIO オブジェクトに再初期化することはできますが、それではコンテキスト マネージャーが無効になります。以下は、動作するはずだと思ったコードです。Windows 10 で Anaconda Python 3.6.6 を使用しています。
import io
import os
import zipfile
with io.BytesIO() as bytes_io:
with zipfile.ZipFile(bytes_io, mode='w') as zf:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()