Pythonでgzipファイルを扱う - gzip

2025-02-09

Python の標準ライブラリであるgzipモジュールを使用すると、gzip 形式のファイルを簡単に圧縮・展開できます。本記事では、gzipモジュールの基本的な使い方から応用的な活用方法、エラー対処法までを詳しく解説します。

1. gzipモジュールとは

gzipモジュールを利用することで、Python コード内で直接 gzip 形式のファイルを圧縮・展開できます。これにより、外部コマンド(gzip, gunzip)を使用する必要がなくなり、ファイルの処理が容易になります。

主な用途

  • ファイルの gzip 圧縮・展開
  • メモリ上のデータの gzip 圧縮・展開
  • コマンドラインインターフェースとしての利用

2. gzip ファイルを圧縮・展開する

2.1 ファイルを圧縮する

以下の例では、テキストファイルを gzip 形式で圧縮しています。

import gzip

# gzip圧縮ファイルを作成
with gzip.open('sample.gz', 'wt') as f:
    f.write('これはgzip圧縮されたテキストファイルです。' * 100)

実行すると、圧縮されたsample.gzが作成されます。

2.2 ファイルを展開する

作成した gzip ファイルを展開するには以下のようにします。

import gzip

# gzipファイルを展開
with gzip.open('sample.gz', 'rt') as f:
    content = f.read()

print(content[:50])  # 展開したテキストの一部を表示

このコードは、gzip 圧縮ファイルをテキスト形式で展開し、展開された内容を表示します。

2.3 メモリ上のデータを圧縮・展開する

ファイルではなく、文字列やバイト列を直接 gzip 圧縮・展開することも可能です。

圧縮

import gzip

text = '短いテキストをgzip圧縮します。'
b = text.encode('utf-8')  # 文字列をバイト列に変換
compressed_data = gzip.compress(b)
print(len(compressed_data))

展開

import gzip

decompressed_data = gzip.decompress(compressed_data)
print(decompressed_data.decode('utf-8'))

3. gzip モジュールの応用例

3.1 大きなデータの圧縮

大きな文字列やデータを gzip 形式で効率的に圧縮する方法を紹介します。

import gzip

# 長い文字列を圧縮
long_text = '圧縮するデータが非常に長い場合、gzipを使用すると効率的です。' * 10000
b = long_text.encode('utf-8')
compressed_data = gzip.compress(b)
print(f"圧縮前: {len(b)} バイト, 圧縮後: {len(compressed_data)} バイト")

3.2 コマンドラインインターフェースの利用

gzipモジュールはコマンドラインインターフェースとしても利用できます。

使用例

$ python3 -m gzip sample.txt  # ファイルをgzip形式で圧縮
$ python3 -m gzip -d sample.txt.gz  # 圧縮ファイルを展開

コマンドラインで簡単に圧縮・展開ができるため、外部コマンドが利用できない環境で便利です。

4. よくあるエラーと対処法

4.1 gzip 形式ではないファイルを展開しようとした場合

非 gzip 形式のファイルをgzip.open()で展開しようとすると、gzip.BadGzipFile例外が発生します。

例外処理を加えたコード

import gzip

try:
    with gzip.open('not_gzip.txt', 'rb') as f:
        data = f.read()
except gzip.BadGzipFile:
    print("指定されたファイルはgzip形式ではありません。")

4.2 バイト列以外のデータを渡した場合

gzip.compress()gzip.decompress()にバイト列以外のデータを渡すと、TypeErrorが発生します。

対処法

バイト列に変換してから処理を行います。

import gzip

try:
    text = '文字列はそのままでは圧縮できません。'
    gzip.compress(text)  # ここでエラー
except TypeError:
    print("文字列をバイト列に変換してください。")

修正例:

b = text.encode('utf-8')
compressed_data = gzip.compress(b)

5. gzip の使いどころ

主な利用シーン

  • 大容量データの保存:
    • ディスク容量を節約したい場合に便利です。
  • ネットワーク通信の効率化:
    • 圧縮されたデータを送信することで通信量を削減できます。
  • ファイル転送の簡略化:
    • テキストやログファイルをまとめて圧縮して転送できます。

6. 結論

gzipモジュールは、Python で gzip 形式のファイルを簡単に扱うための便利なツールです。ファイルやメモリ上のデータを効率よく圧縮・展開できるため、大容量データの処理やネットワーク通信の最適化に活用できます。本記事を参考に、gzipモジュールを活用してみてください。