【Python】パスワードを付けてzip圧縮する方法を解説

この記事では、Pythonの標準ライブラリであるzipfileと、外部ライブラリのpyminizipを使って、ファイルを簡単に圧縮する方法を解説します。

さらに、パスワード付きのzipファイルを作成する方法や、エラーハンドリングの方法についても詳しく説明します。

初心者の方でもわかりやすいように、サンプルコードと実行結果を交えて解説しているので、ぜひ参考にしてください。

目次から探す

zipfileライブラリを使ったzip圧縮

Pythonには標準ライブラリとしてzipfileが用意されており、これを使うことで簡単にファイルを圧縮・解凍することができます。

ここでは、zipfileライブラリを使った基本的な圧縮方法から、パスワード付きのzipファイルの作成方法までを解説します。

zipfileライブラリの基本的な使い方

まずは、zipfileライブラリを使ってファイルを圧縮する基本的な方法を見ていきましょう。

ファイルの圧縮方法

単一のファイルを圧縮する方法を以下に示します。

import zipfile
# 圧縮したいファイルのパス
file_to_compress = 'example.txt'
# 出力するzipファイルのパス
output_zip = 'example.zip'
# zipファイルを作成
with zipfile.ZipFile(output_zip, 'w') as zipf:
    zipf.write(file_to_compress)

このコードでは、example.txtというファイルをexample.zipという名前のzipファイルに圧縮しています。

zipfile.ZipFileクラスのインスタンスを作成し、writeメソッドを使ってファイルを追加します。

複数ファイルの圧縮方法

次に、複数のファイルを一つのzipファイルに圧縮する方法を見てみましょう。

import zipfile
# 圧縮したいファイルのリスト
files_to_compress = ['example1.txt', 'example2.txt', 'example3.txt']
# 出力するzipファイルのパス
output_zip = 'examples.zip'
# zipファイルを作成
with zipfile.ZipFile(output_zip, 'w') as zipf:
    for file in files_to_compress:
        zipf.write(file)

このコードでは、example1.txtexample2.txtexample3.txtの3つのファイルをexamples.zipという名前のzipファイルに圧縮しています。

forループを使って、複数のファイルを順次追加しています。

パスワード付きzipファイルの作成

zipfileライブラリを使ってパスワード付きのzipファイルを作成することもできますが、いくつかの制限事項があります。

zipfileライブラリの制限事項

zipfileライブラリは標準ライブラリであるため、基本的な圧縮・解凍機能は備えていますが、パスワード付きのzipファイルを作成する機能は直接サポートしていません。

そのため、パスワード付きのzipファイルを作成するには、他のライブラリを使用する必要があります。

pyminizipライブラリを使ったzip圧縮

Pythonでパスワード付きのzipファイルを作成するためには、pyminizipライブラリを使用するのが便利です。

このライブラリは、zipfileライブラリでは対応していないパスワード付きのzipファイルを簡単に作成することができます。

pyminizipライブラリの基本的な使い方

まず、pyminizipライブラリをインストールする必要があります。

以下のコマンドを使用してインストールします。

pip install pyminizip

ファイルの圧縮方法

pyminizipを使用して単一のファイルを圧縮する方法を見てみましょう。

以下のコードは、example.txtというファイルをexample.zipという名前で圧縮する例です。

import pyminizip
# 圧縮するファイル
input_file = "example.txt"
# 出力するzipファイル
output_file = "example.zip"
# パスワード(今回は空文字列)
password = ""
# 圧縮レベル(1-9)
compression_level = 5
# ファイルを圧縮
pyminizip.compress(input_file, None, output_file, password, compression_level)

このコードを実行すると、example.txtexample.zipとして圧縮されます。

複数ファイルの圧縮方法

複数のファイルを圧縮する場合も、pyminizipを使用することができます。

ただし、複数ファイルを圧縮する場合は、ディレクトリごと圧縮するのが一般的です。

以下のコードは、example_dirというディレクトリ内のすべてのファイルをexample.zipとして圧縮する例です。

import pyminizip
import os
# 圧縮するディレクトリ
input_dir = "example_dir"
# 出力するzipファイル
output_file = "example.zip"
# パスワード(今回は空文字列)
password = ""
# 圧縮レベル(1-9)
compression_level = 5
# ディレクトリ内のすべてのファイルを取得
files = [os.path.join(input_dir, f) for f in os.listdir(input_dir)]
# ファイルを圧縮
for file in files:
    pyminizip.compress(file, None, output_file, password, compression_level)

このコードを実行すると、example_dir内のすべてのファイルがexample.zipとして圧縮されます。

パスワード付きzipファイルの作成

pyminizipを使用すると、簡単にパスワード付きのzipファイルを作成することができます。

パスワードの設定方法

以下のコードは、example.txtというファイルをexample.zipという名前で圧縮し、パスワードを設定する例です。

import pyminizip
# 圧縮するファイル
input_file = "example.txt"
# 出力するzipファイル
output_file = "example.zip"
# パスワード
password = "mypassword"
# 圧縮レベル(1-9)
compression_level = 5
# ファイルを圧縮
pyminizip.compress(input_file, None, output_file, password, compression_level)

このコードを実行すると、example.txtmypasswordというパスワードで保護されたexample.zipとして圧縮されます。

圧縮レベルの設定方法

pyminizipでは、圧縮レベルを1から9の範囲で設定することができます。

圧縮レベルが高いほど、圧縮率が高くなりますが、圧縮にかかる時間も長くなります。

以下のコードは、圧縮レベルを9に設定してファイルを圧縮する例です。

import pyminizip
# 圧縮するファイル
input_file = "example.txt"
# 出力するzipファイル
output_file = "example.zip"
# パスワード
password = "mypassword"
# 圧縮レベル(1-9)
compression_level = 9
# ファイルを圧縮
pyminizip.compress(input_file, None, output_file, password, compression_level)

このコードを実行すると、example.txtが圧縮レベル9で圧縮され、mypasswordというパスワードで保護されたexample.zipとして保存されます。

以上が、pyminizipライブラリを使用してパスワード付きのzipファイルを作成する方法です。

pyminizipを使用することで、簡単にパスワード付きのzipファイルを作成できるため、セキュリティを強化したい場合に非常に便利です。

エラーハンドリング

Pythonでzipファイルを扱う際には、エラーハンドリングが重要です。

エラーハンドリングを適切に行うことで、予期しないエラーが発生した場合でもプログラムがクラッシュせず、適切な対処が可能になります。

ここでは、zipfileライブラリとpyminizipライブラリを使用した際のエラーハンドリングについて解説します。

zipfileでのエラーハンドリング

圧縮時のエラー

zipfileライブラリを使用してファイルを圧縮する際に発生する可能性のあるエラーには、ファイルが存在しない、読み取り権限がない、ディスク容量が不足しているなどがあります。

これらのエラーをキャッチして適切に処理する方法を以下に示します。

import zipfile
import os
def compress_file(file_path, zip_path):
    try:
        with zipfile.ZipFile(zip_path, 'w') as zipf:
            if not os.path.exists(file_path):
                raise FileNotFoundError(f"File {file_path} does not exist")
            zipf.write(file_path, os.path.basename(file_path))
        print(f"File {file_path} has been compressed successfully into {zip_path}")
    except FileNotFoundError as e:
        print(f"Error: {e}")
    except PermissionError as e:
        print(f"Error: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
# 使用例
compress_file('example.txt', 'example.zip')

解凍時のエラー

解凍時にも同様に、ファイルが存在しない、読み取り権限がない、ディスク容量が不足しているなどのエラーが発生する可能性があります。

以下のコードは、これらのエラーをキャッチして適切に処理する方法を示しています。

def extract_file(zip_path, extract_to):
    try:
        with zipfile.ZipFile(zip_path, 'r') as zipf:
            zipf.extractall(extract_to)
        print(f"Files have been extracted successfully to {extract_to}")
    except FileNotFoundError as e:
        print(f"Error: {e}")
    except PermissionError as e:
        print(f"Error: {e}")
    except zipfile.BadZipFile as e:
        print(f"Error: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
# 使用例
extract_file('example.zip', './extracted')

pyminizipでのエラーハンドリング

圧縮時のエラー

pyminizipライブラリを使用してファイルを圧縮する際にも、ファイルが存在しない、読み取り権限がない、ディスク容量が不足しているなどのエラーが発生する可能性があります。

以下のコードは、これらのエラーをキャッチして適切に処理する方法を示しています。

import pyminizip
import os
def compress_file_with_password(file_path, zip_path, password):
    try:
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"File {file_path} does not exist")
        pyminizip.compress(file_path, None, zip_path, password, 5)
        print(f"File {file_path} has been compressed successfully into {zip_path} with password")
    except FileNotFoundError as e:
        print(f"Error: {e}")
    except PermissionError as e:
        print(f"Error: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
# 使用例
compress_file_with_password('example.txt', 'example.zip', 'password123')

解凍時のエラー

解凍時にも同様に、ファイルが存在しない、読み取り権限がない、ディスク容量が不足している、パスワードが間違っているなどのエラーが発生する可能性があります。

以下のコードは、これらのエラーをキャッチして適切に処理する方法を示しています。

def extract_file_with_password(zip_path, extract_to, password):
    try:
        pyminizip.uncompress(zip_path, password, extract_to, 0)
        print(f"Files have been extracted successfully to {extract_to}")
    except FileNotFoundError as e:
        print(f"Error: {e}")
    except PermissionError as e:
        print(f"Error: {e}")
    except RuntimeError as e:
        print(f"Error: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
# 使用例
extract_file_with_password('example.zip', './extracted', 'password123')

以上のように、zipfileおよびpyminizipライブラリを使用する際には、エラーハンドリングを適切に行うことで、予期しないエラーが発生した場合でもプログラムが安定して動作するようになります。

目次から探す