[Python] フォルダを除外してファイルのみzip圧縮する方法を解説

Pythonでフォルダを除外し、ファイルのみをzip圧縮するには、zipfileモジュールを使用します。

まず、osモジュールを使ってディレクトリ内のファイルをリストアップします。

次に、zipfile.ZipFileクラスを用いて新しいzipファイルを作成し、writeメソッドでファイルを追加します。

この際、フォルダはスキップし、ファイルのみを対象とすることで、フォルダを除外した圧縮が可能です。

この方法により、特定のディレクトリ内のファイルを効率的に圧縮できます。

この記事でわかること
  • zipfileモジュールの基本的な使い方
  • フォルダを除外してファイルのみを圧縮する方法
  • 特定の拡張子のファイルを圧縮する方法
  • サブディレクトリ内のファイルを含める方法
  • 圧縮ファイルのパスワード保護の実装方法

目次から探す

Pythonでフォルダを除外してファイルのみをzip圧縮する方法

zipfileモジュールの基本

zipfileモジュールとは

zipfileモジュールは、Pythonに標準で搭載されているライブラリで、ZIP形式の圧縮ファイルを作成、読み込み、解凍するための機能を提供します。

このモジュールを使用することで、簡単にファイルを圧縮したり、圧縮されたファイルを操作したりすることができます。

特に、フォルダを除外してファイルのみを圧縮する際に非常に便利です。

zipfileモジュールのインストール方法

zipfileモジュールはPythonの標準ライブラリの一部であるため、特別なインストールは必要ありません。

Pythonがインストールされていれば、すぐに使用することができます。

以下のコマンドでPythonがインストールされているか確認できます。

python --version

基本的な使い方

zipfileモジュールを使用するためには、まずインポートする必要があります。

以下は、基本的な使い方の例です。

import zipfile
# ZIPファイルを作成
with zipfile.ZipFile('example.zip', 'w') as zipf:
    zipf.write('file1.txt')
    zipf.write('file2.txt')

このコードでは、example.zipという名前のZIPファイルを作成し、file1.txtfile2.txtをその中に追加しています。

with文を使用することで、ファイルのクローズ処理を自動的に行うことができます。

$ python script.py

このスクリプトを実行すると、カレントディレクトリにexample.zipというZIPファイルが作成され、その中に指定したファイルが含まれます。

フォルダを除外してファイルのみを圧縮する方法

必要なライブラリのインポート

フォルダを除外してファイルのみを圧縮するためには、zipfileモジュールに加えて、ファイルやフォルダの操作を行うためのosモジュールもインポートします。

以下のようにインポートします。

import os
import zipfile

ファイルとフォルダの区別方法

ファイルとフォルダを区別するためには、os.pathモジュールのisfile関数を使用します。

この関数は、指定したパスがファイルであるかどうかを判定します。

以下はその例です。

path = 'example.txt'
if os.path.isfile(path):
    print(f"{path}はファイルです。")
else:
    print(f"{path}はフォルダです。")

ファイルのみをリストアップする方法

指定したディレクトリ内のファイルのみをリストアップするには、os.listdir関数を使用し、各アイテムがファイルかどうかを確認します。

以下のコードは、特定のディレクトリ内のファイルをリストアップする方法を示しています。

directory = 'target_directory'
files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
print("ファイル一覧:")
for file in files:
    print(file)

このコードでは、target_directory内のファイルをリストアップし、ファイル名を表示します。

zipファイルの作成とファイルの追加

ファイルのみをリストアップした後、それらをZIPファイルに追加する方法は以下の通りです。

directory = 'target_directory'
zip_filename = 'files.zip'
with zipfile.ZipFile(zip_filename, 'w') as zipf:
    for file in os.listdir(directory):
        file_path = os.path.join(directory, file)
        if os.path.isfile(file_path):
            zipf.write(file_path, arcname=file)  # arcnameでファイル名を指定
print(f"{zip_filename}が作成されました。")

このコードでは、指定したディレクトリ内のファイルをすべてZIPファイルに追加し、files.zipという名前のZIPファイルを作成します。

arcnameを使用することで、ZIPファイル内のファイル名を指定することができます。

$ python script.py

このスクリプトを実行すると、target_directory内のファイルがfiles.zipに圧縮されます。

フォルダは除外され、ファイルのみが含まれます。

実際のコード例

シンプルなコード例

以下は、指定したディレクトリ内のファイルのみをZIP圧縮するシンプルなコード例です。

このコードは、基本的な機能を実装しています。

import os
import zipfile
def zip_files(directory, zip_filename):
    with zipfile.ZipFile(zip_filename, 'w') as zipf:
        for file in os.listdir(directory):
            file_path = os.path.join(directory, file)
            if os.path.isfile(file_path):
                zipf.write(file_path, arcname=file)
# 使用例
zip_files('target_directory', 'files.zip')
print("ファイルが圧縮されました。")

このコードを実行すると、target_directory内のファイルがfiles.zipに圧縮されます。

エラーハンドリングの追加

次に、エラーハンドリングを追加して、ディレクトリが存在しない場合や、ZIPファイルの作成に失敗した場合に適切なメッセージを表示するようにします。

import os
import zipfile
def zip_files(directory, zip_filename):
    try:
        if not os.path.exists(directory):
            raise FileNotFoundError(f"{directory}が見つかりません。")
        
        with zipfile.ZipFile(zip_filename, 'w') as zipf:
            for file in os.listdir(directory):
                file_path = os.path.join(directory, file)
                if os.path.isfile(file_path):
                    zipf.write(file_path, arcname=file)
        print("ファイルが圧縮されました。")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
# 使用例
zip_files('target_directory', 'files.zip')

このコードでは、指定したディレクトリが存在しない場合にFileNotFoundErrorを発生させ、エラーメッセージを表示します。

コードの最適化

最後に、コードを最適化して、リスト内包表記を使用してファイルをリストアップし、より効率的に処理を行うようにします。

import os
import zipfile
def zip_files(directory, zip_filename):
    try:
        if not os.path.exists(directory):
            raise FileNotFoundError(f"{directory}が見つかりません。")
        
        files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
        
        with zipfile.ZipFile(zip_filename, 'w') as zipf:
            for file in files:
                zipf.write(os.path.join(directory, file), arcname=file)
        
        print("ファイルが圧縮されました。")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
# 使用例
zip_files('target_directory', 'files.zip')

この最適化されたコードでは、リスト内包表記を使用してファイルをリストアップし、可読性と効率性を向上させています。

これにより、コードがより簡潔になり、パフォーマンスも向上します。

応用例

特定の拡張子のみを圧縮する方法

特定の拡張子を持つファイルのみを圧縮するには、ファイル名の拡張子をチェックする条件を追加します。

以下のコードは、.txtファイルのみを圧縮する例です。

import os
import zipfile
def zip_specific_extension(directory, zip_filename, extension):
    try:
        if not os.path.exists(directory):
            raise FileNotFoundError(f"{directory}が見つかりません。")
        
        files = [f for f in os.listdir(directory) if f.endswith(extension) and os.path.isfile(os.path.join(directory, f))]
        
        with zipfile.ZipFile(zip_filename, 'w') as zipf:
            for file in files:
                zipf.write(os.path.join(directory, file), arcname=file)
        
        print(f"{extension}ファイルが圧縮されました。")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
# 使用例
zip_specific_extension('target_directory', 'text_files.zip', '.txt')

このコードを実行すると、target_directory内の.txtファイルのみがtext_files.zipに圧縮されます。

サブディレクトリ内のファイルも含める方法

サブディレクトリ内のファイルも含めて圧縮するには、os.walkを使用してディレクトリを再帰的に探索します。

以下はその例です。

import os
import zipfile
def zip_all_files(directory, zip_filename):
    try:
        if not os.path.exists(directory):
            raise FileNotFoundError(f"{directory}が見つかりません。")
        
        with zipfile.ZipFile(zip_filename, 'w') as zipf:
            for root, _, files in os.walk(directory):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, arcname=os.path.relpath(file_path, directory))
        
        print("すべてのファイルが圧縮されました。")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
# 使用例
zip_all_files('target_directory', 'all_files.zip')

このコードを実行すると、target_directory内のすべてのファイル(サブディレクトリ内のファイルも含む)がall_files.zipに圧縮されます。

圧縮ファイルのパスワード保護

zipfileモジュール自体にはパスワード保護の機能はありませんが、pyzipperライブラリを使用することで、ZIPファイルにパスワードを設定することができます。

以下はその例です。

import os
import pyzipper
def zip_with_password(directory, zip_filename, password):
    try:
        if not os.path.exists(directory):
            raise FileNotFoundError(f"{directory}が見つかりません。")
        
        with pyzipper.AESZipFile(zip_filename, 'w', compression=pyzipper.ZIP_DEFLATED) as zipf:
            zipf.setpassword(password.encode('utf-8'))
            for file in os.listdir(directory):
                file_path = os.path.join(directory, file)
                if os.path.isfile(file_path):
                    zipf.write(file_path, arcname=file)
        
        print("パスワード保護されたZIPファイルが作成されました。")
        
    except Exception as e:
        print(f"エラーが発生しました: {e}")
# 使用例
zip_with_password('target_directory', 'protected_files.zip', 'your_password')

このコードを実行すると、target_directory内のファイルがprotected_files.zipに圧縮され、指定したパスワードで保護されます。

pyzipperライブラリを使用するためには、事前にインストールが必要です。

以下のコマンドでインストールできます。

pip install pyzipper

これにより、ZIPファイルのセキュリティを強化することができます。

よくある質問

zipfileモジュール以外の方法はありますか?

はい、zipfileモジュール以外にも、shutilモジュールを使用してファイルを圧縮することができます。

shutil.make_archive関数を使うことで、指定したディレクトリをZIP形式で圧縮することが可能です。

ただし、shutilはフォルダ全体を圧縮するため、特定のファイルのみを圧縮する場合にはzipfileモジュールが適しています。

関連記事:[Python] shutilモジュールを使用してzip圧縮する方法

圧縮ファイルのサイズを小さくする方法は?

圧縮ファイルのサイズを小さくするためには、以下の方法があります。

  • 圧縮レベルの調整: zipfileモジュールでは、圧縮レベルを指定することができます。

zipfile.ZipFilecompresslevel引数を使用して、圧縮率を調整できます。

  • 不要なファイルの除外: 圧縮する際に、不要なファイルやフォルダを除外することで、圧縮ファイルのサイズを小さくできます。
  • 異なる圧縮形式の使用: ZIP形式以外にも、targzipなどの圧縮形式を使用することで、より小さなサイズに圧縮できる場合があります。

圧縮ファイルの解凍方法は?

圧縮ファイルを解凍するには、zipfileモジュールのZipFileクラスを使用します。

例:zipf.extractall(extract_to) # zipfはoepn済み

このコードを実行すると、対象のzipファイルがextract_toディレクトリに解凍されます。

関連記事:[Python] zipファイルを解凍する方法

まとめ

この記事では、Pythonを使用してフォルダを除外し、ファイルのみをZIP圧縮する方法について詳しく解説しました。

具体的には、zipfileモジュールの基本的な使い方から、特定の拡張子のファイルを圧縮する方法、サブディレクトリ内のファイルを含める方法、圧縮ファイルのパスワード保護まで、さまざまな応用例を紹介しました。

これを機に、Pythonを使ったファイル管理や圧縮処理に挑戦してみてください。

  • URLをコピーしました!
目次から探す