[Python] shutilモジュールを使用してzip圧縮する方法
Pythonのshutil
モジュールは、ファイル操作を簡単に行うための便利なツールを提供しています。
特に、ディレクトリ全体をzip形式で圧縮する際にshutil.make_archive
関数が役立ちます。
この関数は、指定したディレクトリを圧縮し、zipファイルとして保存します。
圧縮形式はformat
引数で指定でき、'zip'
を選択することでzip圧縮が可能です。
この方法を使うことで、手軽にディレクトリを圧縮し、バックアップやデータ転送を効率化できます。
- shutil.make_archiveを使った圧縮の基本的な使い方
- 単一ファイル、複数ファイル、ディレクトリ全体の圧縮方法
- 圧縮ファイルの解凍方法
- 圧縮ファイルのパスワード保護や自動バックアップの方法
- 他の圧縮形式との違いや圧縮サイズを小さくする方法
shutilモジュールとは
shutil
モジュールは、Pythonに標準で搭載されているファイル操作を簡単に行うためのモジュールです。
このモジュールを使用することで、ファイルやディレクトリのコピー、移動、削除、圧縮などの操作を簡単に実行できます。
特に、ファイルの圧縮や解凍に関しては、shutil.make_archive関数
を利用することで、手軽にZIP形式の圧縮ファイルを作成することができます。
インストール方法
shutil
モジュールはPythonの標準ライブラリの一部であるため、特別なインストールは不要です。
Pythonがインストールされていれば、すぐに使用することができます。
以下のコマンドでPythonがインストールされているか確認できます。
python --version
Pythonがインストールされていれば、次のようにshutil
モジュールをインポートして使用できます。
import shutil
このように、shutil
モジュールは特別な設定なしで利用できるため、すぐにファイル操作を始めることができます。
shutilモジュールを使ったzip圧縮
Pythonのshutil
モジュールを使用すると、簡単にファイルやディレクトリをZIP形式で圧縮することができます。
ここでは、shutil.make_archive関数
を中心に、圧縮の方法を詳しく解説します。
shutil.make_archiveの使い方
shutil.make_archive関数
は、指定したパスに圧縮ファイルを作成するための関数です。
基本的な構文は以下の通りです。
import shutil
shutil.make_archive(archive_name, format, root_dir=None, base_dir=None)
archive_name
: 作成する圧縮ファイルの名前(拡張子は不要)format
: 圧縮形式(例: ‘zip’)root_dir
: 圧縮するファイルやディレクトリのルートパスbase_dir
: 圧縮する対象のディレクトリ(省略可能)
圧縮するファイルとディレクトリの指定方法
圧縮するファイルやディレクトリは、root_dir
引数で指定します。
例えば、特定のディレクトリ内のすべてのファイルを圧縮したい場合、以下のように指定します。
import shutil
shutil.make_archive('my_archive', 'zip', root_dir='path/to/directory')
このコードでは、path/to/directory
内のすべてのファイルがmy_archive.zip
として圧縮されます。
圧縮ファイルの保存場所の指定
圧縮ファイルの保存場所は、archive_name
引数で指定します。
フルパスを指定することで、任意の場所に圧縮ファイルを保存できます。
例えば、次のように指定します。
import shutil
shutil.make_archive('/path/to/save/my_archive', 'zip', root_dir='path/to/directory')
この場合、/path/to/save/
にmy_archive.zip
が作成されます。
圧縮形式の指定
shutil.make_archive
では、圧縮形式を指定することができます。
一般的な形式には、’zip’や’tar’などがあります。
以下の例では、ZIP形式で圧縮しています。
import shutil
shutil.make_archive('my_archive', 'zip', root_dir='path/to/directory')
圧縮形式を変更する場合は、format
引数を変更するだけで簡単に対応できます。
例えば、’tar’形式で圧縮する場合は次のようにします。
import shutil
shutil.make_archive('my_archive', 'tar', root_dir='path/to/directory')
このように、shutil
モジュールを使うことで、簡単にファイルやディレクトリを圧縮することができます。
実践例
ここでは、shutil
モジュールを使用して、単一ファイル、複数ファイル、ディレクトリ全体の圧縮方法と、圧縮ファイルの解凍方法について具体的な例を示します。
単一ファイルの圧縮
単一のファイルをZIP形式で圧縮するには、まずそのファイルを含むディレクトリを指定し、shutil.make_archive
を使用します。
以下の例では、example.txt
というファイルを圧縮します。
import shutil
# 単一ファイルを含むディレクトリを指定
shutil.make_archive('single_file_archive', 'zip', root_dir='path/to/directory', base_dir='example.txt')
このコードを実行すると、path/to/directory
内のexample.txt
がsingle_file_archive.zip
として圧縮されます。
複数ファイルの圧縮
複数のファイルを圧縮する場合、base_dir
を指定せずに、root_dir
内のすべてのファイルを圧縮することができます。
以下の例では、directory
内のすべてのファイルを圧縮します。
import shutil
# ディレクトリ内のすべてのファイルを圧縮
shutil.make_archive('multiple_files_archive', 'zip', root_dir='path/to/directory')
このコードを実行すると、path/to/directory
内のすべてのファイルがmultiple_files_archive.zip
として圧縮されます。
ディレクトリ全体の圧縮
特定のディレクトリ全体を圧縮する場合も、root_dir
を指定するだけで簡単に行えます。
以下の例では、my_folder
というディレクトリを圧縮します。
import shutil
# ディレクトリ全体を圧縮
shutil.make_archive('my_folder_archive', 'zip', root_dir='path/to/my_folder')
このコードを実行すると、path/to/my_folder
内のすべてのファイルとサブディレクトリがmy_folder_archive.zip
として圧縮されます。
圧縮ファイルの解凍
圧縮ファイルを解凍するには、shutil
モジュールのunpack_archive関数
を使用します。
以下の例では、先ほど作成したmy_folder_archive.zip
を解凍します。
import shutil
# 圧縮ファイルを解凍
shutil.unpack_archive('my_folder_archive.zip', extract_dir='path/to/extract')
このコードを実行すると、my_folder_archive.zip
がpath/to/extract
に解凍され、元のファイルとディレクトリ構造が復元されます。
これらの実践例を通じて、shutil
モジュールを使ったファイルやディレクトリの圧縮・解凍が簡単に行えることがわかります。
応用例
shutil
モジュールを使用した圧縮操作には、さまざまな応用が可能です。
ここでは、圧縮ファイルのパスワード保護、分割、自動バックアップ、転送について具体的な例を紹介します。
圧縮ファイルのパスワード保護
shutil
モジュール自体には圧縮ファイルのパスワード保護機能はありませんが、zipfile
モジュールを使用することで実現できます。
以下の例では、example.txt
をパスワード付きのZIPファイルに圧縮します。
import zipfile
# パスワード付きのZIPファイルを作成
with zipfile.ZipFile('protected_archive.zip', 'w') as zipf:
zipf.setpassword(b'my_password') # パスワードを設定
zipf.write('path/to/example.txt')
このコードを実行すると、example.txt
がprotected_archive.zip
として圧縮され、パスワードが設定されます。
圧縮ファイルの分割
大きなファイルを分割して圧縮する場合、zipfile
モジュールを使用して手動で分割することができます。
以下の例では、large_file.txt
を分割して圧縮します。
import zipfile
# 大きなファイルを分割して圧縮
with zipfile.ZipFile('split_archive.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
zipf.write('path/to/large_file.txt')
# ここで分割処理を実装(例: サイズ制限を超えた場合に新しいZIPファイルを作成)
このコードは基本的な圧縮処理を示していますが、実際にはファイルサイズをチェックして分割するロジックを追加する必要があります。
圧縮ファイルの自動バックアップ
定期的にファイルを圧縮してバックアップを取る場合、スクリプトを作成して自動化することができます。
以下の例では、特定のディレクトリを毎日バックアップするスクリプトの一部を示します。
import shutil
import datetime
# バックアップ用のディレクトリを指定
backup_dir = 'path/to/backup'
today = datetime.date.today()
# ディレクトリを圧縮してバックアップ
shutil.make_archive(f'{backup_dir}/backup_{today}', 'zip', root_dir='path/to/directory')
このコードを実行すると、指定したディレクトリが日付付きのZIPファイルとしてバックアップされます。
これを定期的に実行することで、自動バックアップが可能になります。
圧縮ファイルの転送
圧縮ファイルを他のサーバーやコンピュータに転送する場合、shutil
モジュールを使用してファイルをコピーすることができます。
以下の例では、圧縮ファイルを指定したディレクトリに転送します。
import shutil
# 圧縮ファイルを転送
shutil.copy('path/to/archive.zip', 'path/to/destination/directory/')
このコードを実行すると、archive.zip
が指定した宛先ディレクトリにコピーされます。
これにより、圧縮ファイルを簡単に転送することができます。
これらの応用例を通じて、shutil
モジュールを使った圧縮操作がさまざまなシナリオで活用できることがわかります。
よくある質問
まとめ
この記事では、Pythonのshutil
モジュールを使用してZIP圧縮を行う方法について詳しく解説しました。
圧縮の基本から応用例、よくある質問までを振り返ることで、実践的な知識を得ることができたと思います。
ぜひ、実際のプロジェクトでshutil
モジュールを活用して、効率的なファイル管理を行ってみてください。