【Python】複数フォルダをまとめて圧縮する方法

この記事では、Pythonを使ってフォルダを圧縮する方法について解説します。

基本的な圧縮方法から始めて、複数のフォルダをまとめて圧縮する方法や、サブフォルダを含むフォルダの圧縮、さらには大きなファイルを分割して圧縮する方法まで、初心者でもわかりやすく説明します。

Pythonの標準ライブラリであるshutilzipfileを使った具体的なコード例も紹介するので、実際に試しながら学んでみてください。

目次から探す

基本的な圧縮方法

Pythonには、ファイルやフォルダを圧縮するための便利なライブラリがいくつか用意されています。

ここでは、代表的なライブラリであるshutilzipfileを使った圧縮方法について解説します。

shutilを使った圧縮

shutilは、ファイル操作を簡単に行うための標準ライブラリです。

このライブラリを使うことで、フォルダを簡単に圧縮することができます。

shutil.make_archiveの使い方

shutilライブラリの中でも、特に便利なのがshutil.make_archive関数です。

この関数を使うことで、指定したフォルダを簡単に圧縮ファイルにまとめることができます。

以下は、shutil.make_archiveの基本的な使い方です。

import shutil
# 圧縮するフォルダのパス
folder_to_compress = 'path/to/folder'
# 圧縮ファイルの保存先と名前
output_filename = 'compressed_folder'
# 圧縮形式('zip', 'tar', 'gztar', 'bztar', 'xztar'など)
format = 'zip'
# フォルダを圧縮
shutil.make_archive(output_filename, format, folder_to_compress)

単一フォルダの圧縮例

具体的な例を見てみましょう。

例えば、example_folderというフォルダをexample.zipという名前で圧縮する場合、以下のようにコードを書きます。

import shutil
# 圧縮するフォルダのパス
folder_to_compress = 'example_folder'
# 圧縮ファイルの保存先と名前
output_filename = 'example'
# 圧縮形式
format = 'zip'
# フォルダを圧縮
shutil.make_archive(output_filename, format, folder_to_compress)

このコードを実行すると、example_folderexample.zipという名前で圧縮されます。

zipfileを使った圧縮

zipfileは、ZIPファイルを作成、読み取り、書き込みするための標準ライブラリです。

shutilと比べて、より細かい操作が可能です。

zipfile.ZipFileの使い方

zipfile.ZipFileクラスを使うことで、ZIPファイルを作成し、ファイルやフォルダを追加することができます。

以下は、zipfile.ZipFileの基本的な使い方です。

import zipfile
import os
# 圧縮するフォルダのパス
folder_to_compress = 'path/to/folder'
# 圧縮ファイルの保存先と名前
output_filename = 'compressed_folder.zip'
# ZIPファイルを作成
with zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
    for root, dirs, files in os.walk(folder_to_compress):
        for file in files:
            # ファイルをZIPファイルに追加
            zipf.write(os.path.join(root, file),
                       os.path.relpath(os.path.join(root, file),
                                       os.path.join(folder_to_compress, '..')))

単一フォルダの圧縮例

具体的な例を見てみましょう。

例えば、example_folderというフォルダをexample.zipという名前で圧縮する場合、以下のようにコードを書きます。

import zipfile
import os
# 圧縮するフォルダのパス
folder_to_compress = 'example_folder'
# 圧縮ファイルの保存先と名前
output_filename = 'example.zip'
# ZIPファイルを作成
with zipfile.ZipFile(output_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
    for root, dirs, files in os.walk(folder_to_compress):
        for file in files:
            # ファイルをZIPファイルに追加
            zipf.write(os.path.join(root, file),
                       os.path.relpath(os.path.join(root, file),
                                       os.path.join(folder_to_compress, '..')))

このコードを実行すると、example_folderexample.zipという名前で圧縮されます。

以上が、shutilzipfileを使った基本的な圧縮方法です。

次に、複数フォルダをまとめて圧縮する方法について解説します。

複数フォルダの圧縮

Pythonを使って複数のフォルダをまとめて圧縮する方法について解説します。

複数のフォルダを一つのZIPファイルにまとめる方法や、フォルダごとに個別に圧縮する方法を紹介します。

フォルダのリストを取得する

まず、圧縮したいフォルダのリストを取得する方法を説明します。

Pythonの標準ライブラリであるosモジュールを使うと、ディレクトリ内のフォルダやファイルのリストを簡単に取得できます。

os.listdirを使ったフォルダのリスト取得

os.listdir関数を使うと、指定したディレクトリ内の全てのファイルとフォルダのリストを取得できます。

以下のコードは、指定したディレクトリ内のフォルダのみをリストアップする例です。

import os
def get_folders(directory):
    # 指定したディレクトリ内の全てのファイルとフォルダを取得
    items = os.listdir(directory)
    # フォルダのみをフィルタリング
    folders = [item for item in items if os.path.isdir(os.path.join(directory, item))]
    return folders
# 使用例
directory = 'path/to/your/directory'
folders = get_folders(directory)
print(folders)

フォルダのフィルタリング方法

上記のコードでは、os.path.isdirを使ってフォルダのみをフィルタリングしています。

これにより、指定したディレクトリ内のフォルダのリストを取得できます。

複数フォルダを一つのZIPファイルにまとめる

次に、複数のフォルダを一つのZIPファイルにまとめる方法を説明します。

zipfileモジュールを使うと、複数のフォルダを一つのZIPファイルにまとめて圧縮できます。

zipfile.ZipFileを使った複数フォルダの圧縮

以下のコードは、複数のフォルダを一つのZIPファイルにまとめて圧縮する例です。

import os
import zipfile
def zip_folders(folders, output_zip):
    with zipfile.ZipFile(output_zip, 'w') as zipf:
        for folder in folders:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, os.path.join(folder, '..')))
# 使用例
folders = ['folder1', 'folder2', 'folder3']
output_zip = 'output.zip'
zip_folders(folders, output_zip)

このコードでは、os.walkを使って各フォルダ内の全てのファイルを再帰的に取得し、zipfile.ZipFileを使ってZIPファイルに追加しています。

フォルダごとに圧縮する方法

次に、各フォルダを個別に圧縮する方法を説明します。

以下のコードは、各フォルダを個別のZIPファイルに圧縮する例です。

import os
import zipfile
def zip_each_folder(folders):
    for folder in folders:
        output_zip = f"{folder}.zip"
        with zipfile.ZipFile(output_zip, 'w') as zipf:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, os.path.join(folder, '..')))
# 使用例
folders = ['folder1', 'folder2', 'folder3']
zip_each_folder(folders)

このコードでは、各フォルダに対して個別のZIPファイルを作成し、そのフォルダ内の全てのファイルを圧縮しています。

圧縮ファイルの保存場所の指定

圧縮ファイルの保存場所を指定する方法について説明します。

圧縮ファイルの保存場所を指定することで、任意のディレクトリに圧縮ファイルを保存できます。

保存場所の指定方法

以下のコードは、圧縮ファイルの保存場所を指定する例です。

import os
import zipfile
def zip_folders_with_output_dir(folders, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for folder in folders:
        output_zip = os.path.join(output_dir, f"{os.path.basename(folder)}.zip")
        with zipfile.ZipFile(output_zip, 'w') as zipf:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, os.path.join(folder, '..')))
# 使用例
folders = ['folder1', 'folder2', 'folder3']
output_dir = 'path/to/output/directory'
zip_folders_with_output_dir(folders, output_dir)

このコードでは、output_dirに指定したディレクトリに圧縮ファイルを保存します。

指定したディレクトリが存在しない場合は、os.makedirsを使ってディレクトリを作成します。

保存場所の確認方法

圧縮ファイルの保存場所を確認するには、圧縮ファイルのパスを出力する方法があります。

以下のコードは、圧縮ファイルの保存場所を出力する例です。

import os
import zipfile
def zip_folders_with_output_dir(folders, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    for folder in folders:
        output_zip = os.path.join(output_dir, f"{os.path.basename(folder)}.zip")
        with zipfile.ZipFile(output_zip, 'w') as zipf:
            for root, dirs, files in os.walk(folder):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, os.path.join(folder, '..')))
        print(f"Saved: {output_zip}")
# 使用例
folders = ['folder1', 'folder2', 'folder3']
output_dir = 'path/to/output/directory'
zip_folders_with_output_dir(folders, output_dir)

このコードでは、圧縮ファイルの保存場所をprint関数で出力しています。

これにより、圧縮ファイルがどこに保存されたかを確認できます。

以上が、Pythonを使って複数のフォルダをまとめて圧縮する方法です。

これらの方法を使えば、効率的に複数のフォルダを圧縮し、管理することができます。

応用例

サブフォルダを含むフォルダの圧縮

フォルダの中にさらにサブフォルダが存在する場合、それらも含めて圧縮する方法について解説します。

Pythonの標準ライブラリであるshutilzipfileを使うことで、サブフォルダを含むフォルダ全体を簡単に圧縮することができます。

再帰的にフォルダを圧縮する方法

再帰的にフォルダを圧縮するためには、フォルダ内の全てのファイルとサブフォルダを探索し、それらを一つの圧縮ファイルにまとめる必要があります。

ここでは、os.walkを使って再帰的にフォルダを探索し、zipfileを使って圧縮する方法を紹介します。

os.walkの使い方

os.walkは、指定したディレクトリ以下の全てのファイルとフォルダを再帰的に探索するための便利な関数です。

以下にos.walkの基本的な使い方を示します。

import os
for root, dirs, files in os.walk('対象フォルダのパス'):
    for file in files:
        print(os.path.join(root, file))

このコードは、指定したフォルダ内の全てのファイルのパスを出力します。

rootは現在のディレクトリ、dirsはサブディレクトリのリスト、filesはファイルのリストを表します。

圧縮ファイルの分割

大きなフォルダやファイルを圧縮する際、一つの圧縮ファイルが非常に大きくなることがあります。

これを避けるために、圧縮ファイルを複数の小さなファイルに分割する方法があります。

Pythonでは、zipfileライブラリを使って分割圧縮を行うことができます。

大きなファイルを分割して圧縮する方法

以下に、指定したサイズごとにファイルを分割して圧縮する方法を示します。

この例では、1つのファイルが100MBを超える場合に分割します。

import os
import zipfile
def split_zip(input_folder, output_folder, max_size):
    zip_counter = 1
    current_size = 0
    zip_file = zipfile.ZipFile(os.path.join(output_folder, f'archive_{zip_counter}.zip'), 'w', zipfile.ZIP_DEFLATED)
    for root, dirs, files in os.walk(input_folder):
        for file in files:
            file_path = os.path.join(root, file)
            file_size = os.path.getsize(file_path)
            
            if current_size + file_size > max_size:
                zip_file.close()
                zip_counter += 1
                current_size = 0
                zip_file = zipfile.ZipFile(os.path.join(output_folder, f'archive_{zip_counter}.zip'), 'w', zipfile.ZIP_DEFLATED)
            
            zip_file.write(file_path, os.path.relpath(file_path, input_folder))
            current_size += file_size
    zip_file.close()
# 使用例
split_zip('対象フォルダのパス', '出力フォルダのパス', 100 * 1024 * 1024)  # 100MB

このコードは、指定したフォルダ内のファイルを100MBごとに分割して圧縮します。

分割圧縮のメリットとデメリット

メリット

  • ファイルサイズの制限を回避: 大きなファイルを扱う際、ファイルシステムやメールの添付ファイルサイズ制限を回避できます。
  • 転送の効率化: 大きなファイルを分割することで、ネットワーク転送時の失敗リスクを減らし、再送の手間を軽減できます。

デメリット

  • 管理の煩雑さ: 分割されたファイルを管理する手間が増えます。

全ての分割ファイルが揃わないと元のファイルに戻せないため、注意が必要です。

  • 圧縮効率の低下: 分割することで圧縮効率が低下する場合があります。

特に、圧縮アルゴリズムが大きなデータセットに対して最適化されている場合です。

以上が、Pythonを使った複数フォルダの圧縮方法とその応用例です。

これらの方法を活用することで、効率的にファイルを管理し、必要に応じて圧縮・分割することができます。

目次から探す