【初心者歓迎】Python でフォルダをZip圧縮するツールを作ろう

Pythonを使ってフォルダを簡単に圧縮したいけれど、どうやればいいか分からない?そんなあなたにお勧めです。

この記事では、Pythonを使ってフォルダをZIP形式で圧縮する方法を、初心者でも分かりやすく解説しています。

AES暗号化を使ったパスワード付きのZIPファイルも簡単に作成できるので、セキュリティ対策もバッチリ。

簡易的なUIを搭載しており、直前に指定したフォルダやZipファイル名を記憶しているため、ルーチンワークにもぴったりです。

また、暗号化/復号化は関数化しているので、ご自身のソースコードにコピペしてお使いいただけます。

自作ツールを作るためのポイントと今後公開予定の自作ツール一覧を「【実践】Pythonで事務処理向け自作ツールを作ろう!」で紹介していますので、併せてご覧ください。

目次

フォルダ圧縮ツールの概要

今回紹介するフォルダZip圧縮ツールには、次の特徴があります。

  • 指定したフォルダを丸ごとZipファイルに圧縮します。
  • 強力なAES暗号を使って圧縮します。(※但し、Windows標準の解凍機能では解凍不可)
  • 空のフォルダは圧縮フォルダから除外されます。
  • 圧縮対象フォルダはドラッグ&ドロップで指定可能です。
  • 設定画面に入力した内容は、画面を閉じる際に自動でjsonファイルに保存されます。

フォルダ圧縮ツールの使い方

画面項目の説明

画面項目説明
圧縮したいフォルダZip圧縮したいフォルダのパス
暗号化有効スイッチ暗号化(パスワード付きZip圧縮)の有効/無効
パスワード暗号化のパスワード
出力先ZipファイルZipファイルのパス(拡張子を省略すると自動的に .Zipを追加)
フォルダ圧縮ボタンフォルダ圧縮の実行

フォルダ圧縮の手順

  • 圧縮対象のフォルダを指定します。
  • 必要に応じて、AES暗号化のスイッチをONにし、パスワードを入力します。
  • Zipファイルの出力先フォルダとファイル名を入力します。
  • 「フォルダを圧縮する」ボタンをクリックします。

動作環境の設定

STEP
Pythonのインストール

事前に、Pythonのインストールが必要です。まだ環境構築がお済みでない方は、下記の記事を参考に構築してください。

自作ツールのためのポータブルPython開発・実行環境を作ろう!プログラム実行時に必要
WinPythonにVSCode Portable版を入れよう!プログラム修正時に必要
STEP
ライブラリのインストール

Python 環境に下記のライブラリをインストールします。 command.bat を実行後、下記のコマンドを実行します。

pip install customtkinter
pip install tkinterdnd2
pip install pyzipper

STEP
ソースコードのダウンロードと展開

フォルダ圧縮ツールと共通パッケージの2つをダウンロードし、2つのフォルダが同一階層になるように解凍してください。

実行方法

次の手順で実行してください。

  • WinPython のインストールフォルダ内にある command.bat を実行
  • ダウンロードしたプログラムファイルをコピーした場所にカレントディレクトリを移動
  • Python main.py を実行

Python main.py

しばらくすると下記の画面が表示されます。ワイルドカード以外は空白で表示されますので、必要な箇所を入力してください。尚、ワイルドカードのみ、前回の変更内容を保存しないようにしています。

実行すると、コマンドプロンプトに圧縮対象のファイル名が表示され、最後に出力先Zipファイル名が表示されます。

フォルダ圧縮ツールの仕様

プログラムの構成

main.py の中で画面の表示と「フォルダを圧縮する」ボタンのイベント処理を記述しています。イベント処理の中でzip_util.pyを呼び出し、compress_folder関数にて圧縮を行っています。

モジュール名役割
main.py画面の表示とボタンクリックのイベント処理
zip_util.pyフォルダのZip圧縮、Zipファイルの解凍処理
create_ui.pyUI定義ファイルを読み込み、記述されたウィジェットを画面表示
customtkinterファイル選択やフォルダ選択、ドラッグ&ドロップを実現するための補助
appconfig.py画面に入力された値をJson形式のファイルに保存/読込する

ソースコード

main.py

UI画面の表示と「CSVに出力する」ボタンの処理が記述されています。

       
import os
import sys
sys.path.append(os.path.join(os.path. dirname(__file__), '../libs'))
from create_ui import CreateUI
from zip_util import compress_folder

# ボタンが押された時の処理
def func(param):

    password = None
    if param["password_switch"]:
        password = param["password_entry"]

    out_path = param["output_file"]
    if not os.path.splitext(out_path)[1]:
        out_path += ".zip"
        ui.widgets["output_file"].set(out_path)

    compress_folder(param["input_folder"],out_path,password)


# インスタンス生成
ui = CreateUI(func)

# 画面の表示
ui.show()

zip_util.py

このファイルには、次の2つの関数が含まれています。 

関数名説明
compress_folder(
folder_path, #圧縮するフォルダのパス
zip_path, #出力するZIPファイルのパス
password# 圧縮する際のパスワード((初期値:None)
)
指定されたフォルダ内のファイルを再帰的に取得し、Zipファイルとして出力します。
passwordが指定されていると、AES暗号化を用いてパスワード付きZipファイルを作成します。
extract_zip(
zip_path, #解凍するZIPファイルのパス
extract_to, #出力先のフォルダパス
password#解凍する際のパスワード (初期値:None)
)
指定されたZipファイルを解凍します。passwordが指定されていると、そのパスワードを用いて解凍します。

20行目と29行目で圧縮対象のファイル名を取得(file_path)していますので、これに対してフィルタリング条件を付けると、例えば指定した拡張子のみを圧縮対象としたり、特定のキーワードが含まれるファイル名やフォルダを圧縮しないようにすることも可能です。

# pip install pyzipper 
import os
import zipfile
import pyzipper

def compress_folder(folder_path, zip_path, password=None):
    """
    指定したフォルダを圧縮します。パスワードが指定された場合、パスワード付きで圧縮します。

    :param folder_path: 圧縮するフォルダのパス
    :param zip_path: 出力するZIPファイルのパス
    :param password: 圧縮する際のパスワード(デフォルトはNone)
    """
    if password:
        # パスワード付きで圧縮 (AES暗号化)
        with pyzipper.AESZipFile(zip_path, 'w', compression=pyzipper.ZIP_DEFLATED, encryption=pyzipper.WZ_AES) as zipf:
            zipf.setpassword(password.encode('utf-8'))
            for root, _, files in os.walk(folder_path):
                for file in files:
                    file_path = os.path.join(root, file)
                    arcname = os.path.relpath(file_path, folder_path)
                    zipf.write(file_path, arcname)
                    print(file_path)
    else:
        # パスワードなしで圧縮
        with zipfile.ZipFile(zip_path, 'w', compression=zipfile.ZIP_DEFLATED) as zipf:
            for root, _, files in os.walk(folder_path):
                for file in files:
                    file_path = os.path.join(root, file)
                    arcname = os.path.relpath(file_path, folder_path)
                    zipf.write(file_path, arcname)
                    print(file_path)
    print(f"{zip_path} を作成しました。")


def extract_zip(zip_path, extract_to, password=None):
    """
    ZIPファイルを解凍します。パスワードが指定された場合、パスワード付きで解凍します。

    :param zip_path: 解凍するZIPファイルのパス
    :param extract_to: 出力先のフォルダパス
    :param password: 解凍する際のパスワード(デフォルトはNone)
    """
    if password:
        # パスワード付きで解凍
        with pyzipper.AESZipFile(zip_path, 'r', encryption=pyzipper.WZ_AES) as zipf:
            zipf.setpassword(password.encode('utf-8'))
            zipf.extractall(extract_to)
    else:
        # パスワードなしで解凍
        with zipfile.ZipFile(zip_path, 'r') as zipf:
            zipf.extractall(extract_to)

design.txt

title:フォルダ圧縮ツール
mode:light
max:1024,280
size:600,280
min:600,280
input_folder:圧縮対象フォルダ,フォルダ選択
{
    password_switch:AES暗号化圧縮 ※標準機能では解凍できません
    password_entry:100
}
output_file:出力先Zipファイル,ファイル選択
extract_button:フォルダを圧縮する

design.txt の記述方法については、下記の記事で詳しく解説しています。

あわせて読みたい
【CustomTkinter】テキスト記述でGUIを簡単作成するライブラリを紹介! 本ブログで紹介しているツールも含め、自作ツールはちょっとした作業を自動化することが目的なので、簡易的な画面で事足りることが大半です。 とはいうものの、CustomTk...

まとめ

今回は、「フォルダ圧縮ツール」について、環境構築の手順と使い方、ソースコードを紹介しました。

指定したフォルダを丸ごと圧縮することが可能で、直前に指定したフォルダや出力ファイルを覚えているため、同じフォルダを定期的に圧縮したい時に便利です。

また、強力なAESを用いて暗号化することが可能ですが、Windows標準のZIP解凍機能はAESに対応していないため、他の解凍ツールを用いて解凍してください。

再利用しやすいように、圧縮処理と解凍処理は関数化していますので、必要に応じてコピペしてお使いください。

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

この記事を書いた人

コメント

コメントする

目次