TIL

Today I Learned. 知ったこと、学んだことを書いていく

gzipモジュールを使った圧縮と展開 - Python

vcrpyでは、レスポンスの量が多い場合、圧縮されて(バイナリになって)カセットに格納される。どうやって圧縮されたデータを扱うのか調べてみたら標準モジュールのgzipモジュールでできそうだったため、メモしておく

圧縮にはgzip.compress()メソッド。展開にはgzip.decompress()メソッド。それぞれ、バイト配列を扱う。

文字列を圧縮して、展開して、取得してみた

>>> import gzip
>>> t_bytes = bytes('あいう123abc', 'utf-8')
>>> t_bytes
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86123abc'

>>> compressed_bytes = gzip.compress(t_bytes)    # 圧縮
>>> compressed_bytes
b'\x1f\x8b\x08\x00G::[\x02\xff{\xdc\xd8\xf4\xb8\xb1\xe5qc\x9b\xa1\x91qbR2\x00\xe1\xc7\x079\x0f\x00\x00\x00'

>>> decompressed_bytes = gzip.decompress(compressed_bytes)    # 展開
>>> decompressed_bytes
b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86123abc'

>>> decompressed_bytes.decode('utf-8')
'あいう123abc'

gzip.compress()にはバイト配列(bytes)を渡さないといけないため、bytes(str, 'utf-8')でバイト配列を作成する

gzip.compress()に作成したバイト配列を渡して、圧縮する。

展開にはgzip.decompress()を使う。圧縮されているバイト配列を渡すことで、展開してくれる

展開したバイト配列をbytes.decode()で文字列に変換し、終了

これで、一応、圧縮と展開ができるようになった

参考文献