mei_13のPython講座 ロゴ

【Pythonコラム】Pythonで手軽に圧縮・解凍!gzip.open()の世界へようこそ




Pythonで手軽に圧縮・解凍!gzip.open()の世界へようこそ

Pythonでファイル操作をしていると、ファイルのサイズが大きすぎて困ることがありますよね。そんな時に役立つのが、ファイルの圧縮です。Python標準ライブラリの gzip モジュールを使えば、簡単にファイルをgzip形式で圧縮したり、解凍したりすることができます。

中でも、gzip.open() 関数は、圧縮・解凍されたファイルを読み書きするための強力なツールです。この記事では、gzip.open() の基本的な使い方から、ちょっと便利な応用まで、初心者の方にもわかりやすく解説していきます。

gzip.open() の基本: ファイルの圧縮と解凍

gzip.open() は、通常の open() 関数とよく似たインターフェースを持っています。違うのは、gzip形式で圧縮されたファイルを扱うことができる点です。

まずは、簡単な例を見てみましょう。

import gzip

# ファイルをgzip形式で圧縮して書き込む
with gzip.open("my_file.gz", "wt") as f:
    f.write("これはgzipで圧縮されたテキストです。\n")
    f.write("複数行のテキストも問題ありません。\n")

# gzip形式で圧縮されたファイルを読み込む
with gzip.open("my_file.gz", "rt") as f:
    for line in f:
        print(line, end="")

この例では、まず my_file.gz というgzip形式のファイルを書き込みモード ("wt") で開きます。"wt" は、テキストモードで書き込みを行うことを意味します。with ステートメントを使うことで、ファイル操作が終わった時に自動的にファイルが閉じられるので、安全で便利です。

次に、ファイルにテキストを書き込みます。ここでは、f.write() メソッドを使って、複数行のテキストを書き込んでいます。

その後、my_file.gz を読み込みモード ("rt") で開き、for ループを使って1行ずつ読み込んでコンソールに出力しています。"rt" は、テキストモードで読み込みを行うことを意味します。end="" を指定することで、改行が重複するのを防いでいます。

gzip.open() のモード指定: バイナリモードも使える!

gzip.open() では、テキストモード ("t") だけでなく、バイナリモード ("b") も使うことができます。バイナリモードは、画像や動画などのバイナリファイルを圧縮・解凍する際に必要です。

import gzip

# バイナリファイルをgzip形式で圧縮して書き込む
with gzip.open("image.png.gz", "wb") as f:
    with open("image.png", "rb") as original_file:
        f.writelines(original_file)

# gzip形式で圧縮されたバイナリファイルを読み込む
with gzip.open("image.png.gz", "rb") as f:
    with open("extracted_image.png", "wb") as extracted_file:
        extracted_file.writelines(f)

この例では、image.png というPNG形式の画像をgzip形式で圧縮し、image.png.gz というファイルに保存しています。書き込みモードは "wb" で、バイナリモードで書き込みを行うことを意味します。

読み込みの際も、"rb" を使ってバイナリモードでファイルを開き、読み込んだデータを extracted_image.png というファイルに書き込んでいます。

gzip.open() の圧縮レベル: より小さく、より速く

gzip.open() では、圧縮レベルを指定することができます。圧縮レベルは、0から9までの整数で指定し、9が最も高い圧縮率、0が圧縮なしを意味します。デフォルトの圧縮レベルは6です。

圧縮レベルを高くすると、ファイルサイズは小さくなりますが、圧縮・解凍にかかる時間は長くなります。逆に、圧縮レベルを低くすると、ファイルサイズは大きくなりますが、圧縮・解凍にかかる時間は短くなります。

import gzip

# 圧縮レベル9でファイルを圧縮する
with gzip.open("my_file_level9.gz", "wt", compresslevel=9) as f:
    f.write("これは圧縮レベル9で圧縮されたテキストです。\n")

# 圧縮レベル1でファイルを圧縮する (高速だが圧縮率は低い)
with gzip.open("my_file_level1.gz", "wt", compresslevel=1) as f:
    f.write("これは圧縮レベル1で圧縮されたテキストです。\n")

この例では、compresslevel パラメータを使って、圧縮レベルを9と1に指定しています。状況に合わせて適切な圧縮レベルを選ぶことで、ファイルサイズと処理速度のバランスを取ることができます。

gzip.open() の応用: 大量のデータを効率的に処理する

gzip.open() は、大きなファイルを扱う際にも非常に有効です。例えば、ログファイルを圧縮して保存したり、圧縮されたデータをネットワーク経由で送受信したりする際に役立ちます。

gzip.open()shutil モジュールを組み合わせることで、ディレクトリ全体を圧縮することも可能です。

import gzip
import shutil
import os

# ディレクトリを圧縮する関数
def make_tarfile(output_filename, source_dir):
    with gzip.open(output_filename, "wb") as tar_gz:
        with shutil.TarFile(fileobj=tar_gz, mode="w") as tar:
            tar.add(source_dir, arcname=os.path.basename(source_dir))

# 圧縮したいディレクトリを指定
source_directory = "my_directory"

# 出力ファイル名を指定
output_file = "my_directory.tar.gz"

# ディレクトリを圧縮する
make_tarfile(output_file, source_directory)

この例では、my_directory というディレクトリを my_directory.tar.gz というgzip形式のアーカイブファイルに圧縮しています。shutil.TarFile を使うことで、ディレクトリ構造を維持したまま圧縮することができます。

まとめ

gzip.open() は、Pythonでgzip形式のファイルを扱うための強力なツールです。基本的なファイルの読み書きだけでなく、圧縮レベルの調整やバイナリファイルの処理、さらにはディレクトリ全体の圧縮まで、様々な場面で活躍します。

この記事を参考に、gzip.open() を使いこなして、Pythonでのファイル操作をより効率的に行ってみてください。



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

レッスン概要

◯月額4,000円で質問し放題!!
◯完全オンライン
◯翌日までには必ず返信
◯挫折しない独自の学習メソッド
◯圧倒的高評価!!
◯テキストベースで時間を選ばない
◯高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!