mei_13のPython講座 ロゴ

【解説】Pythonでデータを賢く圧縮!gzip.open()の使い方を優しく解説




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

Pythonでデータを賢く圧縮!gzip.open()の使い方を優しく解説


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!最近、趣味で作っているプログラムで扱うデータがどんどん大きくなってきちゃって……。テキストファイルなんですけど、ディスクの容量を結構圧迫しているんです。何か良い解決策はありませんか?


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。データのサイズが大きくなってくると、ストレージの空き容量が気になりますよね……。特にテキストデータは、そのまま保存しておくと意外と場所を取ってしまうものです。 そんな時は、ファイルを圧縮して保存するのがおすすめですよ。Pythonには標準で「gzip」というモジュールがあって、これを使えば簡単にファイルを圧縮したり、圧縮されたまま読み込んだりできるんです。


Hirokiのアイコン
【Hiroki】 圧縮、ですか。ZIPファイルみたいな感じでしょうか?


Yukiのアイコン
【Yuki】 そうですね、仕組みは似ていますが、gzipは主に1つのファイルを圧縮するのに適した形式です。 今日は、その中でも特に便利な「gzip.open()」という関数について解説しますね。これを使えば、普段使っているopen()関数とほとんど同じ感覚で、圧縮ファイルを扱うことができるんですよ……。

gzipモジュールとgzip.open()の基本


Hirokiのアイコン
【Hiroki】 open()と同じ感覚で使えるなら、僕でもすぐに覚えられそうです!まずはどうやって使い始めるんですか?


Yukiのアイコン
【Yuki】 まずは、Pythonの標準ライブラリであるgzipをインポートする必要があります。標準ライブラリなので、追加でインストールする必要はありません。 もっとも基本的な使い方は、このような形になります。

import gzip

# データを圧縮して保存する
with gzip.open('sample.txt.gz', 'wt', encoding='utf-8') as f:
    f.write('これはgzipで圧縮されたテキストデータです。')


Hirokiのアイコン
【Hiroki】 おぉ、本当にいつものopen()とそっくりですね! 'wt'というモードは、テキストを書き込むという意味ですか?


Yukiのアイコン
【Yuki】 はい、その通りです。'w'は書き込み(write)、't'はテキスト(text)を意味します。 gzipは本来バイナリデータを扱うものなのですが、't'を付けることで、普通のテキストファイルと同じように文字列をそのまま書き込めるようになるんです。 ちなみに、拡張子は.gzとするのが一般的ですよ。


Hirokiのアイコン
【Hiroki】 なるほど。逆に、保存したファイルを読み込む時はどうすればいいんでしょう?


Yukiのアイコン
【Yuki】 読み込む時も同じように'rt'(リード・テキスト)モードを使えば大丈夫です。

import gzip

# 圧縮されたファイルを読み込む
with gzip.open('sample.txt.gz', 'rt', encoding='utf-8') as f:
    content = f.read()
    print(content)


Yukiのアイコン
【Yuki】 このように、with構文(コンテキストマネージャ)を使うことで、ファイルのクローズ処理も自動で行ってくれるので、安全にファイルを扱えます……。わたしも、大切なデータを扱うときは、いつもこの書き方をするようにしています。

テキストモードとバイナリモードの使い分け


Hirokiのアイコン
【Hiroki】 さっきの'wt''rt'に「t」を付けていましたが、もし付けなかったらどうなるんですか?


Yukiのアイコン
【Yuki】 良い質問ですね。't'を付けない場合、デフォルトではバイナリモード'b')として扱われます。 バイナリモードでは、文字列(str型)ではなくバイト列(bytes型)をやり取りすることになるんです。


Hirokiのアイコン
【Hiroki】 バイト列……。ちょっと難しそうですね。


Yukiのアイコン
【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のアイコン
【Hiroki】 あ、本当だ。TypeErrorが出ていますね。テキストを扱う時は't'を忘れないように気をつけます!

圧縮レベルを調整してパフォーマンスを最適化する


Hirokiのアイコン
【Hiroki】 Yukiさん、gzipを使っていて思ったんですけど、圧縮するのって少し時間がかかったりしませんか?


Yukiのアイコン
【Yuki】 Hirokiくん、鋭いですね……。実は、圧縮にはCPUの計算リソースを使うので、普通のファイル書き込みよりは少し時間がかかります。 でも、gzip.open()にはcompresslevelという引数があって、圧縮の強さを調整することができるんですよ。


Hirokiのアイコン
【Hiroki】 圧縮の強さ、ですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 なるほど!用途に合わせて選べるんですね。ログファイルみたいに頻繁に書き込むなら少し低めのレベル、保存用の大きなデータならレベル9、という使い分けができそうです。


Yukiのアイコン
【Yuki】 そうですね。そのバランスを考えるのも、プログラミングの楽しいところだとわたしは思います。 誰かの役に立つために作られた小さなツールが、この圧縮設定一つでサクサク動くようになったりすると、なんだか嬉しくなりますよね……。

AIのAPIレスポンスを保存する実践的な例


Hirokiのアイコン
【Hiroki】 最近はAIの勉強もしているんですけど、AIから返ってきた長い文章を保存しておくのにも使えそうですね。


Yukiのアイコン
【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のアイコン
【Hiroki】 JSONファイルもそのまま圧縮して保存できるんですね!これなら、APIをたくさん叩いてデータを集めても、ディスク容量を心配しなくて済みそうです。


Yukiのアイコン
【Yuki】 はい。テキスト形式のデータはgzipとの相性がとても良いので、劇的にサイズが小さくなるはずですよ。 特にJSONは構造が繰り返されることが多いので、圧縮効率が非常に高いんです。

既存のファイルを圧縮する方法


Hirokiのアイコン
【Hiroki】 あ、もう一つ質問してもいいですか? すでにディスクにある普通のテキストファイルを、後からgzip形式に変換したい時はどうすればいいんでしょう?


Yukiのアイコン
【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のアイコン
【Yuki】 これなら、メモリをたくさん消費せずに、どんなに大きなファイルでも安全に圧縮することができます。 rbwbを使って、バイナリとしてそのまま流し込むのがコツですね……。

注意点とまとめ


Hirokiのアイコン
【Hiroki】 Yukiさん、今日もたくさん教えてくれてありがとうございます!gzip.open()、明日からさっそく使ってみます。


Yukiのアイコン
【Yuki】 どういたしまして。あ、最後に一つだけ注意点があります。 gzip形式は、ファイルの途中から読み込んだり(ランダムアクセス)、追記したりするのはあまり得意ではありません。 追記自体は可能ですが、効率が悪くなることもあるので、基本的には「一気に書き込む」「最初から最後まで読み込む」という使い方をするのが一番スムーズですよ。


Hirokiのアイコン
【Hiroki】 なるほど、あくまで「まとめて圧縮・展開」するのが基本なんですね。覚えておきます!


Yukiのアイコン
【Yuki】 はい。少しずつ、自分のプログラムが洗練されていくのは素敵なことだと思います。 何か困ったことがあったら、またいつでも聞いてくださいね。わたしで良ければ、力になりますから……。 夜はまだ長いですし、自分のペースでゆっくり学んでいきましょう。

参考資料



< str.split()
コラム一覧に戻る
Tkinter-キーバインド >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki