この記事では、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.txt
がexample.zip
に圧縮されます。
zipfile.ZipFileクラス
のwriteメソッド
を使って、指定したファイルをzipファイルに追加しています。
複数ファイルの圧縮
次に、複数のファイルを一つのzipファイルに圧縮する方法を見てみましょう。
以下のコードは、file1.txt
とfile2.txt
をmultiple_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.txt
とfile2.txt
がmultiple_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.ZipFile
のcompression
引数にzipfile.ZIP_DEFLATED
を指定しています。
これにより、デフォルトの圧縮アルゴリズムが使用されます。
圧縮ファイルの追加
既存のzipファイルに新しいファイルを追加することも可能です。
以下のコードは、既存のexample.zip
にnew_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を使ってログファイルの圧縮やディレクトリのバックアップを自動化することで、システムの運用を効率化し、データの保全を確実に行うことができます。