【Python】ファイルを作らずにデータをGzip圧縮する
はじめに
コード中で生成したデータを、Gzip圧縮してAWSのS3バケットにアップロードする必要がありました。ローカルにファイルを作ってそれを送るのが手っ取り早いんですが、ファイルを作らずに済むスマートな方法を模索していたら、こんな時間になってしまいました。記事にしたためて供養します。
方法
以下のように、 io.BytesIO()
をバイト列のバッファとして宣言しておき、GzipFile()
の書き込み先として指定します。バイト列の書き込みが済んだら、 io.BytesIO().read()
を使ってバッファの中身をgzipファイルとして扱えばよいみたいです。
import io from gzip import GzipFile ... gz_io = io.BytesIO() with GzipFile(fileobj=gz_io, mode='wb') as gz: gz.write(data.encode()) gz_io.seek(0) # bucketはboto3.resource('s3').Bucket() put_result = bucket.put_object( Body=gz_io.read(), Key=obj_key, ContentEncoding='gzip' )
果たしてこれがスマートと言えるのかは追求しないことにします。ああしんどかった。