shinobe179の日記

@shinobe179 の技術メモ・やらかし録

【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'
)

果たしてこれがスマートと言えるのかは追求しないことにします。ああしんどかった。