Pythonでファイルに書き出さずにzip圧縮
この記事では、Python でファイルを生成せずに zip 圧縮したデータを生成する方法を紹介します。
zip 圧縮したデータを Python 内からアップロードしたい場合なんかに、ファイルに書き出して後から削除する手間を避けたかったり、FaaS などそもそも ReadOnly のファイルシステムで使ったりすることを想定しています。
動作環境
- Python 3.7
動かし方
Python の zipfile ライブラリと、 io.BytesIO を用いて実現します。
# zip 圧縮したデータをファイルに書き出す代わりに BytesIO のストリームを作成 zip_stream = io.BytesIO() # ファイルに書き出す代わりに zip_stream に zip 圧縮したデータを出力 with zipfile.ZipFile(zip_stream, 'w', compression=zipfile.ZIP_DEFLATED) as new_zip: # foo.txt というファイル名で abcdef という文字列をzipファイルに追加 new_zip.writestr("foo.txt", "abcdef") # ローカルの foo.png を zip ファイルに追加 new_zip.write("foo.png") # 生成された zip 圧縮データを出力 # 実際には print の代わりに HTTP の POST とか、S3 へのアップロードとかに使うイメージ print(zip_stream.getvalue())