【Python】ディレクトリごと一括で圧縮・アーカイブする:shutil.make_archive

Pythonでディレクトリ(フォルダ)の中身をまるごと圧縮したい場合、zipfiletarfile モジュールでループ処理を書くよりも、標準ライブラリ 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 モジュールなどを使って個別に実装する必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次