(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonでデータを賢く圧縮!gzip.open()の使い方を優しく解説
![]()
【Hiroki】
Yukiさん、こんにちは!最近、趣味で作っているプログラムで扱うデータがどんどん大きくなってきちゃって……。テキストファイルなんですけど、ディスクの容量を結構圧迫しているんです。何か良い解決策はありませんか?
![]()
【Yuki】
Hirokiくん、こんにちは。データのサイズが大きくなってくると、ストレージの空き容量が気になりますよね……。特にテキストデータは、そのまま保存しておくと意外と場所を取ってしまうものです。
そんな時は、ファイルを圧縮して保存するのがおすすめですよ。Pythonには標準で「gzip」というモジュールがあって、これを使えば簡単にファイルを圧縮したり、圧縮されたまま読み込んだりできるんです。
![]()
【Hiroki】
圧縮、ですか。ZIPファイルみたいな感じでしょうか?
![]()
【Yuki】
そうですね、仕組みは似ていますが、gzipは主に1つのファイルを圧縮するのに適した形式です。
今日は、その中でも特に便利な「gzip.open()」という関数について解説しますね。これを使えば、普段使っているopen()関数とほとんど同じ感覚で、圧縮ファイルを扱うことができるんですよ……。
gzipモジュールとgzip.open()の基本
![]()
【Hiroki】
open()と同じ感覚で使えるなら、僕でもすぐに覚えられそうです!まずはどうやって使い始めるんですか?
![]()
【Yuki】
まずは、Pythonの標準ライブラリであるgzipをインポートする必要があります。標準ライブラリなので、追加でインストールする必要はありません。
もっとも基本的な使い方は、このような形になります。
import gzip
# データを圧縮して保存する
with gzip.open('sample.txt.gz', 'wt', encoding='utf-8') as f:
f.write('これはgzipで圧縮されたテキストデータです。')
![]()
【Hiroki】
おぉ、本当にいつものopen()とそっくりですね!
'wt'というモードは、テキストを書き込むという意味ですか?
![]()
【Yuki】
はい、その通りです。'w'は書き込み(write)、't'はテキスト(text)を意味します。
gzipは本来バイナリデータを扱うものなのですが、't'を付けることで、普通のテキストファイルと同じように文字列をそのまま書き込めるようになるんです。
ちなみに、拡張子は.gzとするのが一般的ですよ。
![]()
【Hiroki】
なるほど。逆に、保存したファイルを読み込む時はどうすればいいんでしょう?
![]()
【Yuki】
読み込む時も同じように'rt'(リード・テキスト)モードを使えば大丈夫です。
import gzip
# 圧縮されたファイルを読み込む
with gzip.open('sample.txt.gz', 'rt', encoding='utf-8') as f:
content = f.read()
print(content)
![]()
【Yuki】
このように、with構文(コンテキストマネージャ)を使うことで、ファイルのクローズ処理も自動で行ってくれるので、安全にファイルを扱えます……。わたしも、大切なデータを扱うときは、いつもこの書き方をするようにしています。
テキストモードとバイナリモードの使い分け
![]()
【Hiroki】
さっきの'wt'や'rt'に「t」を付けていましたが、もし付けなかったらどうなるんですか?
![]()
【Yuki】
良い質問ですね。't'を付けない場合、デフォルトではバイナリモード('b')として扱われます。
バイナリモードでは、文字列(str型)ではなくバイト列(bytes型)をやり取りすることになるんです。
![]()
【Hiroki】
バイト列……。ちょっと難しそうですね。
![]()
【Yuki】
そうですね、最初は戸惑うかもしれません。例えば、画像データや、すでにシリアライズされたバイナリデータを保存する時はバイナリモードを使います。
でも、普通のテキストを扱うなら、エンコーディング(encoding='utf-8'など)を指定してテキストモードで開くのが一番簡単だと思います。
もしバイナリモードでテキストを書こうとすると、こんな風にエラーになってしまうんですよ。
import gzip
# エラーになる例
# with gzip.open('test.gz', 'wb') as f:
# f.write('こんにちは') # TypeError: a bytes-like object is required, not 'str'
![]()
【Hiroki】
あ、本当だ。TypeErrorが出ていますね。テキストを扱う時は't'を忘れないように気をつけます!
圧縮レベルを調整してパフォーマンスを最適化する
![]()
【Hiroki】
Yukiさん、gzipを使っていて思ったんですけど、圧縮するのって少し時間がかかったりしませんか?
![]()
【Yuki】
Hirokiくん、鋭いですね……。実は、圧縮にはCPUの計算リソースを使うので、普通のファイル書き込みよりは少し時間がかかります。
でも、gzip.open()にはcompresslevelという引数があって、圧縮の強さを調整することができるんですよ。
![]()
【Hiroki】
圧縮の強さ、ですか?
![]()
【Yuki】
はい。0から9までの数値を指定できます。
- 0: 圧縮しません(そのまま保存)。
- 1: 最も速いですが、圧縮率は低いです。
- 9: 最も圧縮率が高いですが、処理に時間がかかります。
デフォルトは9になっていることが多いですが、速度を優先したい場合は値を小さくするといいかもしれません。
import gzip
data = "ものすごく長いテキストデータ..." * 1000
# 速度優先(レベル1)
with gzip.open('fast.txt.gz', 'wt', compresslevel=1) as f:
f.write(data)
# 圧縮率優先(レベル9)
with gzip.open('small.txt.gz', 'wt', compresslevel=9) as f:
f.write(data)
![]()
【Hiroki】
なるほど!用途に合わせて選べるんですね。ログファイルみたいに頻繁に書き込むなら少し低めのレベル、保存用の大きなデータならレベル9、という使い分けができそうです。
![]()
【Yuki】
そうですね。そのバランスを考えるのも、プログラミングの楽しいところだとわたしは思います。
誰かの役に立つために作られた小さなツールが、この圧縮設定一つでサクサク動くようになったりすると、なんだか嬉しくなりますよね……。
AIのAPIレスポンスを保存する実践的な例
![]()
【Hiroki】
最近はAIの勉強もしているんですけど、AIから返ってきた長い文章を保存しておくのにも使えそうですね。
![]()
【Yuki】
いいアイディアですね。最新のAIモデル、例えばGoogleのGeminiなどを使う際、大量の生成結果を保存しておくのにgzipはとても重宝します。
最新のライブラリであるgoogle-genaiを使って、gemini-2.0-flashモデルからの回答を保存する例を考えてみましょうか。
import gzip
import json
from google import genai
client = genai.Client(api_key="YOUR_API_KEY")
# 最新モデルで長い文章を生成(架空の例です)
response = client.models.generate_content(
model="gemini-2.0-flash",
contents="これからのAI技術の展望について、詳細なレポートを書いてください。"
)
# 生成されたテキストを圧縮してJSON形式で保存
output_data = {
"model": "gemini-2.0-flash",
"text": response.text
}
with gzip.open('ai_response.json.gz', 'wt', encoding='utf-8') as f:
json.dump(output_data, f, ensure_ascii=False, indent=4)
![]()
【Hiroki】
JSONファイルもそのまま圧縮して保存できるんですね!これなら、APIをたくさん叩いてデータを集めても、ディスク容量を心配しなくて済みそうです。
![]()
【Yuki】
はい。テキスト形式のデータはgzipとの相性がとても良いので、劇的にサイズが小さくなるはずですよ。
特にJSONは構造が繰り返されることが多いので、圧縮効率が非常に高いんです。
既存のファイルを圧縮する方法
![]()
【Hiroki】
あ、もう一つ質問してもいいですか?
すでにディスクにある普通のテキストファイルを、後からgzip形式に変換したい時はどうすればいいんでしょう?
![]()
【Yuki】
それはよくあるケースですね。一度に全部読み込んで書き出す方法もありますが、ファイルが非常に大きい場合は、shutilというモジュールを組み合わせて、少しずつ転送するのがスマートです。
import gzip
import shutil
# 普通のファイルを圧縮ファイルにコピーする
with open('large_log.log', 'rb') as f_in:
with gzip.open('large_log.log.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
![]()
【Yuki】
これなら、メモリをたくさん消費せずに、どんなに大きなファイルでも安全に圧縮することができます。
rbとwbを使って、バイナリとしてそのまま流し込むのがコツですね……。
注意点とまとめ
![]()
【Hiroki】
Yukiさん、今日もたくさん教えてくれてありがとうございます!gzip.open()、明日からさっそく使ってみます。
![]()
【Yuki】
どういたしまして。あ、最後に一つだけ注意点があります。
gzip形式は、ファイルの途中から読み込んだり(ランダムアクセス)、追記したりするのはあまり得意ではありません。
追記自体は可能ですが、効率が悪くなることもあるので、基本的には「一気に書き込む」「最初から最後まで読み込む」という使い方をするのが一番スムーズですよ。
![]()
【Hiroki】
なるほど、あくまで「まとめて圧縮・展開」するのが基本なんですね。覚えておきます!
![]()
【Yuki】
はい。少しずつ、自分のプログラムが洗練されていくのは素敵なことだと思います。
何か困ったことがあったら、またいつでも聞いてくださいね。わたしで良ければ、力になりますから……。
夜はまだ長いですし、自分のペースでゆっくり学んでいきましょう。
参考資料
- Python 公式ドキュメント: gzip --- gzip ファイルのサポート
- Python 公式ドキュメント: shutil --- 高レベルなファイル操作 (copyfileobj)
- Google AI SDK for Python (google-genai)
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

