【Python】zip形式に圧縮する方法

この記事では、Pythonの標準ライブラリを使って簡単にzipファイルを作成・解凍する方法を初心者向けにわかりやすく解説します。

基本的な使い方から、便利なテクニック、実践的なスクリプトの例まで、幅広くカバーしていますので、ぜひ参考にしてください。

目次から探す

基本的な使い方

Pythonでzip形式に圧縮する方法を学ぶために、まずは基本的な使い方から始めましょう。

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

zipファイルの作成

単一ファイルの圧縮

まずは、単一のファイルをzip形式に圧縮する方法を見てみましょう。

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

import zipfile
# 圧縮するファイルのパス
file_to_compress = 'example.txt'
# 作成するzipファイルの名前
zip_file_name = 'example.zip'
# zipファイルを作成
with zipfile.ZipFile(zip_file_name, 'w') as zipf:
    zipf.write(file_to_compress)
print(f'{file_to_compress}を{zip_file_name}に圧縮しました。')

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

zipfile.ZipFileクラスwriteメソッドを使って、指定したファイルをzipファイルに追加しています。

複数ファイルの圧縮

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

以下のコードは、file1.txtfile2.txtmultiple_files.zipという名前で圧縮する例です。

import zipfile
# 圧縮するファイルのリスト
files_to_compress = ['file1.txt', 'file2.txt']
# 作成するzipファイルの名前
zip_file_name = 'multiple_files.zip'
# zipファイルを作成
with zipfile.ZipFile(zip_file_name, 'w') as zipf:
    for file in files_to_compress:
        zipf.write(file)
print(f'{files_to_compress}を{zip_file_name}に圧縮しました。')

このコードを実行すると、file1.txtfile2.txtmultiple_files.zipに圧縮されます。

forループを使って、リスト内の各ファイルを順番にzipファイルに追加しています。

圧縮レベルの設定

zipfileモジュールでは、圧縮レベルを設定することもできます。

圧縮レベルは0から9までの整数で指定し、0は圧縮なし、9は最高圧縮を意味します。

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

import zipfile
# 圧縮するファイルのパス
file_to_compress = 'example.txt'
# 作成するzipファイルの名前
zip_file_name = 'example_compressed.zip'
# 圧縮レベルの設定
compression_level = zipfile.ZIP_DEFLATED
# zipファイルを作成
with zipfile.ZipFile(zip_file_name, 'w', compression=compression_level) as zipf:
    zipf.write(file_to_compress)
print(f'{file_to_compress}を{zip_file_name}に圧縮しました。')

このコードでは、zipfile.ZipFilecompression引数にzipfile.ZIP_DEFLATEDを指定しています。

これにより、デフォルトの圧縮アルゴリズムが使用されます。

圧縮ファイルの追加

既存のzipファイルに新しいファイルを追加することも可能です。

以下のコードは、既存のexample.zipnew_file.txtを追加する例です。

import zipfile
# 追加するファイルのパス
new_file_to_add = 'new_file.txt'
# 既存のzipファイルの名前
zip_file_name = 'example.zip'
# 既存のzipファイルを開いてファイルを追加
with zipfile.ZipFile(zip_file_name, 'a') as zipf:
    zipf.write(new_file_to_add)
print(f'{new_file_to_add}を{zip_file_name}に追加しました。')

このコードを実行すると、new_file.txtが既存のexample.zipに追加されます。

zipfile.ZipFileのモードを'a'にすることで、既存のzipファイルにファイルを追加することができます。

以上が、Pythonでzip形式に圧縮する基本的な方法です。

次のセクションでは、ディレクトリ全体を圧縮する方法について解説します。

ディレクトリの圧縮

Pythonを使ってディレクトリ全体を圧縮する方法について解説します。

ディレクトリの圧縮は、複数のファイルやサブディレクトリを一つのzipファイルにまとめる際に非常に便利です。

ここでは、標準ライブラリのshutilモジュールを使用します。

ディレクトリ全体を圧縮する方法

まず、ディレクトリ全体を圧縮する基本的な方法を見ていきましょう。

shutilモジュールのmake_archive関数を使用すると、簡単にディレクトリを圧縮できます。

以下は、ディレクトリ全体を圧縮するサンプルコードです。

import shutil
# 圧縮するディレクトリのパス
directory_to_zip = 'path/to/directory'
# 出力するzipファイルのパス(拡張子は不要)
output_zip_file = 'path/to/output_zip_file'
# ディレクトリを圧縮
shutil.make_archive(output_zip_file, 'zip', directory_to_zip)

このコードでは、directory_to_zipに圧縮したいディレクトリのパスを指定し、output_zip_fileに出力するzipファイルのパスを指定します。

shutil.make_archive関数は、指定したディレクトリをzip形式で圧縮し、指定したパスに出力します。

サブディレクトリを含む圧縮

次に、サブディレクトリを含むディレクトリ全体を圧縮する方法について説明します。

実際には、上記の方法と同じshutil.make_archive関数を使用するだけで、サブディレクトリも含めて圧縮されます。

以下は、サブディレクトリを含むディレクトリ全体を圧縮するサンプルコードです。

import shutil
# 圧縮するディレクトリのパス
directory_to_zip = 'path/to/directory_with_subdirs'
# 出力するzipファイルのパス(拡張子は不要)
output_zip_file = 'path/to/output_zip_file_with_subdirs'
# ディレクトリを圧縮
shutil.make_archive(output_zip_file, 'zip', directory_to_zip)

このコードでは、directory_to_zipにサブディレクトリを含むディレクトリのパスを指定し、output_zip_fileに出力するzipファイルのパスを指定します。

shutil.make_archive関数は、指定したディレクトリとそのサブディレクトリを含めてzip形式で圧縮し、指定したパスに出力します。

以上の方法を使えば、Pythonで簡単にディレクトリ全体を圧縮することができます。

次のセクションでは、圧縮ファイルの解凍方法について解説します。

圧縮ファイルの解凍

Pythonでは、zipfileモジュールを使用して圧縮ファイルを解凍することができます。

ここでは、単一ファイルの解凍、複数ファイルの解凍、ディレクトリの解凍について詳しく解説します。

単一ファイルの解凍

まずは、zipファイルから単一のファイルを解凍する方法を見てみましょう。

以下のコードは、example.zipというzipファイルからexample.txtというファイルを解凍する例です。

import zipfile
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# 解凍先のディレクトリ
extract_to = './extracted_files'
# zipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # 単一ファイルを解凍
    zip_ref.extract('example.txt', extract_to)

このコードでは、zipfile.ZipFileクラスを使用してzipファイルを開き、extractメソッドを使用して特定のファイルを解凍しています。

複数ファイルの解凍

次に、zipファイルから複数のファイルを解凍する方法を見てみましょう。

以下のコードは、example.zipというzipファイルからすべてのファイルを解凍する例です。

import zipfile
# 解凍するzipファイルのパス
zip_file_path = 'example.zip'
# 解凍先のディレクトリ
extract_to = './extracted_files'
# zipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # すべてのファイルを解凍
    zip_ref.extractall(extract_to)

このコードでは、extractallメソッドを使用してzipファイル内のすべてのファイルを指定したディレクトリに解凍しています。

ディレクトリの解凍

最後に、zipファイルからディレクトリを含むすべてのファイルを解凍する方法を見てみましょう。

基本的には、複数ファイルの解凍と同じ方法を使用しますが、zipファイル内にディレクトリ構造が含まれている場合でも正しく解凍されます。

import zipfile
# 解凍するzipファイルのパス
zip_file_path = 'example_with_dirs.zip'
# 解凍先のディレクトリ
extract_to = './extracted_files_with_dirs'
# zipファイルを開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # すべてのファイルとディレクトリを解凍
    zip_ref.extractall(extract_to)

このコードでは、example_with_dirs.zipというzipファイルからすべてのファイルとディレクトリを指定したディレクトリに解凍しています。

extractallメソッドは、zipファイル内のディレクトリ構造を保持したまま解凍するため、元のディレクトリ構造が再現されます。

以上が、Pythonを使用してzipファイルを解凍する基本的な方法です。

これらの方法を組み合わせることで、さまざまなシナリオに対応することができます。

便利なテクニック

Pythonでzipファイルを扱う際には、基本的な圧縮・解凍以外にも便利なテクニックがあります。

ここでは、圧縮ファイルの内容を確認する方法、パスワード保護の方法、そして圧縮ファイルの更新方法について解説します。

圧縮ファイルの内容を確認する

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

以下の例では、既存のzipファイルの内容をリスト表示します。

import zipfile
# 確認したいzipファイルのパス
zip_file_path = 'example.zip'
# zipファイルを読み込みモードで開く
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
    # zipファイルの内容をリスト表示
    zip_contents = zip_ref.namelist()
    print("圧縮ファイルの内容:")
    for file_name in zip_contents:
        print(file_name)

このコードを実行すると、example.zip内の全てのファイル名が表示されます。

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

Pythonの標準ライブラリであるzipfileモジュールは、パスワード保護されたzipファイルの作成には対応していません。

しかし、pyminizipという外部ライブラリを使用することで、パスワード保護されたzipファイルを作成することができます。

まず、pyminizipをインストールします。

pip install pyminizip

次に、以下のコードでパスワード保護されたzipファイルを作成します。

import pyminizip
# 圧縮するファイルのパス
file_to_compress = 'example.txt'
# 出力するzipファイルのパス
output_zip_file = 'protected.zip'
# パスワード
password = 'mypassword'
# 圧縮レベル(1-9)
compression_level = 5
# パスワード保護されたzipファイルを作成
pyminizip.compress(file_to_compress, None, output_zip_file, password, compression_level)
print(f"{output_zip_file}が作成されました。")

このコードを実行すると、example.txtがパスワードmypasswordで保護されたprotected.zipに圧縮されます。

圧縮ファイルの更新

既存のzipファイルに新しいファイルを追加する場合も、zipfileモジュールを使用します。

以下の例では、既存のzipファイルに新しいファイルを追加します。

import zipfile
# 既存のzipファイルのパス
zip_file_path = 'example.zip'
# 追加するファイルのパス
new_file = 'new_file.txt'
# zipファイルを追記モードで開く
with zipfile.ZipFile(zip_file_path, 'a') as zip_ref:
    # 新しいファイルを追加
    zip_ref.write(new_file, arcname='new_file.txt')
    print(f"{new_file}が{zip_file_path}に追加されました。")

このコードを実行すると、new_file.txtが既存のexample.zipに追加されます。

以上のテクニックを活用することで、Pythonでのzipファイル操作がさらに便利になります。

ぜひ試してみてください。

実践例

ログファイルの定期的な圧縮

システムの運用やアプリケーションの開発において、ログファイルは非常に重要です。

しかし、ログファイルは時間が経つにつれて大きくなり、ディスクスペースを圧迫することがあります。

そこで、定期的にログファイルを圧縮して保存することで、ディスクスペースを節約しつつ、必要な情報を保持することができます。

以下は、Pythonを使ってログファイルを定期的に圧縮するスクリプトの例です。

このスクリプトは、指定されたディレクトリ内のすべてのログファイルを圧縮し、元のファイルを削除します。

import os
import zipfile
from datetime import datetime
def compress_logs(log_dir, zip_filename):
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root, _, files in os.walk(log_dir):
            for file in files:
                if file.endswith('.log'):
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, log_dir))
                    os.remove(file_path)  # 圧縮後に元のファイルを削除
if __name__ == "__main__":
    log_directory = '/path/to/log/directory'
    zip_file_name = f'logs_{datetime.now().strftime("%Y%m%d%H%M%S")}.zip'
    compress_logs(log_directory, zip_file_name)
    print(f'ログファイルを {zip_file_name} に圧縮しました。')

このスクリプトを定期的に実行するには、cronジョブ(Linux)やタスクスケジューラ(Windows)を使用することができます。

バックアップスクリプトの作成

データのバックアップは、システムの信頼性を確保するために非常に重要です。

Pythonを使って、特定のディレクトリを定期的に圧縮してバックアップするスクリプトを作成することができます。

以下は、指定されたディレクトリを圧縮してバックアップするスクリプトの例です。

このスクリプトは、バックアップディレクトリに圧縮ファイルを保存します。

import os
import zipfile
from datetime import datetime
def backup_directory(source_dir, backup_dir):
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)
    
    zip_filename = os.path.join(backup_dir, f'backup_{datetime.now().strftime("%Y%m%d%H%M%S")}.zip')
    with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root, _, files in os.walk(source_dir):
            for file in files:
                file_path = os.path.join(root, file)
                zipf.write(file_path, os.path.relpath(file_path, source_dir))
    
    print(f'バックアップを {zip_filename} に保存しました。')
if __name__ == "__main__":
    source_directory = '/path/to/source/directory'
    backup_directory = '/path/to/backup/directory'
    backup_directory(source_directory, backup_directory)

このスクリプトも、定期的に実行することで、最新のバックアップを常に保持することができます。

cronジョブやタスクスケジューラを使用して、毎日や毎週のバックアップを自動化することが推奨されます。

以上のように、Pythonを使ってログファイルの圧縮やディレクトリのバックアップを自動化することで、システムの運用を効率化し、データの保全を確実に行うことができます。

目次から探す