Yura YuLife

ITエンジニアの覚え書き。

Pythonでファイルに書き出さずにzip圧縮

この記事では、Python でファイルを生成せずに zip 圧縮したデータを生成する方法を紹介します。

zip 圧縮したデータを Python 内からアップロードしたい場合なんかに、ファイルに書き出して後から削除する手間を避けたかったり、FaaS などそもそも ReadOnly のファイルシステムで使ったりすることを想定しています。

動作環境

動かし方

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())

参考URL