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でのファイル操作をより効率的に行ってみてください。