Pythonでディレクトリ(フォルダ)の中身をまるごと圧縮したい場合、zipfile や tarfile モジュールでループ処理を書くよりも、標準ライブラリ shutil モジュールの make_archive() 関数を使うのが圧倒的に簡単です。
この関数は、1行のコードでディレクトリ全体を指定した形式(ZIPやTARなど)にアーカイブ化できます。
目次
圧縮形式(フォーマット)の一覧
make_archive の第2引数に指定できるフォーマット文字列と、生成されるファイル形式の対応は以下の通りです。
| フォーマット文字列 | 生成される形式・拡張子 | 備考 |
"zip" | ZIPファイル (.zip) | 一般的。Windows標準機能で解凍可能。 |
"tar" | tarファイル (.tar) | 圧縮なしのアーカイブ。 |
"gztar" | gzip圧縮tar (.tar.gz) | Linux/Mac等で標準的。圧縮率と速度のバランスが良い。 |
"bztar" | bzip2圧縮tar (.tar.bz2) | gzipより圧縮率が高いが、少し遅い。 |
"xztar" | xz圧縮tar (.tar.xz) | 非常に高い圧縮率を誇るが、処理に時間がかかる。 |
実装例:ウェブサイト素材の一括圧縮
ここでは、ウェブサイトの画像やCSSが入っているディレクトリ website_assets を、配布用にZIP形式で圧縮して release_package.zip を作成するシナリオを実装します。
ソースコード
import shutil
import os
# 1. 圧縮したいディレクトリ(フォルダ)のパス
# 例: 現在のディレクトリにある "website_assets" フォルダ
target_directory = "website_assets"
# ダミーディレクトリの作成(動作確認用)
if not os.path.exists(target_directory):
os.makedirs(target_directory)
with open(f"{target_directory}/style.css", "w") as f: f.write("body { color: #333; }")
with open(f"{target_directory}/logo.png", "w") as f: f.write("dummy image data")
# 2. 出力するファイル名(拡張子は自動で付くので不要です)
output_filename = "release_package"
# 3. shutil.make_archive(出力名, 形式, 対象ディレクトリ) を実行
# root_dir引数に「圧縮したいディレクトリ」を指定します
archive_path = shutil.make_archive(output_filename, "zip", root_dir=target_directory)
print(f"圧縮完了: {archive_path}")
実行結果
圧縮完了: /path/to/your/directory/release_package.zip
解説
引数の意味
- 第1引数 (
base_name): 作成されるアーカイブのファイル名(パス)。拡張子は指定したフォーマットに応じて自動的に付与されます(例:"release_package"→release_package.zip)。 - 第2引数 (
format): 上記の表にあるフォーマット文字列を指定します。 root_dir: アーカイブに含めるルートディレクトリを指定します。このディレクトリの中身がアーカイブの直下に展開される形になります。
注意点
shutil.make_archive は便利ですが、巨大なディレクトリを圧縮する場合、処理中はメモリや一時領域を使用するため、完了までプログラムがブロック(停止)します。プログレスバーを表示したい場合や、詳細な除外設定が必要な場合は、zipfile モジュールなどを使って個別に実装する必要があります。
