【Python】shutilモジュールを使用してzip圧縮する方法

Pythonの標準ライブラリには、ファイルやディレクトリの操作を簡単に行うための便利なモジュールがいくつか含まれています。

その中でも特に便利なのが shutil モジュールです。

このモジュールを使うことで、ファイルのコピーや移動、削除、さらにはディレクトリ全体の操作まで簡単に行うことができます。

目次から探す

shutilモジュールの概要

shutilモジュールは、シェルユーティリティ(shell utility)の略で、ファイルやディレクトリの高レベルな操作を提供します。

具体的には、ファイルのコピーや移動、ディレクトリの再帰的なコピー、ファイルの圧縮と解凍などが含まれます。

これにより、複雑なファイル操作をシンプルなコードで実現することができます。

shutilモジュールの基本機能

shutilモジュールには多くの便利な関数が含まれています。

以下に主な機能をいくつか紹介します。

  • shutil.copy(src, dst): ファイルをコピーします。

srcはコピー元のファイルパス、dstはコピー先のファイルパスです。

  • shutil.move(src, dst): ファイルやディレクトリを移動します。

srcは移動元のパス、dstは移動先のパスです。

  • shutil.rmtree(path): ディレクトリを再帰的に削除します。

pathは削除するディレクトリのパスです。

  • shutil.make_archive(base_name, format, root_dir): ディレクトリを圧縮してアーカイブファイルを作成します。

base_nameはアーカイブファイルの名前、formatは圧縮形式(例: ‘zip’)、root_dirは圧縮するディレクトリのパスです。

  • shutil.unpack_archive(filename, extract_dir): アーカイブファイルを解凍します。

filenameは解凍するアーカイブファイルのパス、extract_dirは解凍先のディレクトリです。

shutilモジュールのインポート方法

shutilモジュールを使用するには、まずPythonスクリプト内でインポートする必要があります。

インポート方法は非常に簡単で、以下のように記述します。

import shutil

これで、shutilモジュールの全ての機能を使用する準備が整いました。

例えば、ファイルをコピーする場合は以下のように記述します。

import shutil
# コピー元とコピー先のパスを指定
src = 'path/to/source/file.txt'
dst = 'path/to/destination/file.txt'
# ファイルをコピー
shutil.copy(src, dst)

このように、shutilモジュールを使うことで、ファイル操作が非常に簡単になります。

次のセクションでは、具体的にshutilモジュールを使ってzip圧縮を行う方法について詳しく解説します。

shutilモジュールとは

Pythonの標準ライブラリには、ファイルやディレクトリの操作を簡単に行うための便利なモジュールがいくつか含まれています。

その中でも特に便利なのが shutil モジュールです。

このモジュールを使うことで、ファイルのコピーや移動、削除、さらにはディレクトリ全体の操作まで簡単に行うことができます。

shutilモジュールの概要

shutilモジュールは、シェルユーティリティ(shell utility)の略で、ファイルやディレクトリの高レベルな操作を提供します。

具体的には、ファイルのコピーや移動、ディレクトリの再帰的なコピー、ファイルの圧縮と解凍などが含まれます。

これにより、複雑なファイル操作をシンプルなコードで実現することができます。

shutilモジュールの基本機能

shutilモジュールには多くの便利な関数が含まれています。

以下に主な機能をいくつか紹介します。

  • shutil.copy(src, dst): ファイルをコピーします。

srcはコピー元のファイルパス、dstはコピー先のファイルパスです。

  • shutil.move(src, dst): ファイルやディレクトリを移動します。

srcは移動元のパス、dstは移動先のパスです。

  • shutil.rmtree(path): ディレクトリを再帰的に削除します。

pathは削除するディレクトリのパスです。

  • shutil.make_archive(base_name, format, root_dir): ディレクトリを圧縮してアーカイブファイルを作成します。

base_nameはアーカイブファイルの名前、formatは圧縮形式(例: ‘zip’)、root_dirは圧縮するディレクトリのパスです。

  • shutil.unpack_archive(filename, extract_dir): アーカイブファイルを解凍します。

filenameは解凍するアーカイブファイルのパス、extract_dirは解凍先のディレクトリです。

shutilモジュールのインポート方法

shutilモジュールを使用するには、まずPythonスクリプト内でインポートする必要があります。

インポート方法は非常に簡単で、以下のように記述します。

import shutil

これで、shutilモジュールの全ての機能を使用する準備が整いました。

例えば、ファイルをコピーする場合は以下のように記述します。

import shutil
# コピー元とコピー先のパスを指定
src = 'path/to/source/file.txt'
dst = 'path/to/destination/file.txt'
# ファイルをコピー
shutil.copy(src, dst)

このように、shutilモジュールを使うことで、ファイル操作が非常に簡単になります。

次のセクションでは、具体的にshutilモジュールを使ってzip圧縮を行う方法について詳しく解説します。

zip圧縮の基本

zip圧縮とは

zip圧縮とは、複数のファイルやディレクトリを一つのファイルにまとめ、データのサイズを小さくする技術です。

これにより、データの転送や保存が効率的になります。

zip形式は広く利用されており、Windows、macOS、Linuxなどの主要なオペレーティングシステムでサポートされています。

圧縮のメリット

圧縮には以下のようなメリットがあります。

  • データのサイズ削減: 圧縮することでファイルサイズが小さくなり、ストレージの節約や転送速度の向上が期待できます。
  • ファイルの一元管理: 複数のファイルやディレクトリを一つのzipファイルにまとめることで、管理が容易になります。
  • データの保護: 圧縮ファイルにパスワードを設定することで、データの保護が可能です。
  • 転送の効率化: 小さなファイルサイズにより、ネットワークを介したデータ転送が迅速に行えます。

zipファイルの構造

zipファイルは、以下のような構造を持っています。

  • ヘッダー: zipファイルの先頭には、ファイルのメタデータ(ファイル名、圧縮方法、圧縮前後のサイズなど)が含まれています。
  • ファイルデータ: 各ファイルの圧縮データが続きます。

圧縮方法には、DeflateやBzip2などが使用されます。

  • ディレクトリエントリ: zipファイルの末尾には、各ファイルの位置情報やその他のメタデータが含まれています。

このような構造により、zipファイルは効率的にデータを圧縮・解凍することができます。

また、zipファイルは自己解凍形式にすることも可能で、専用のソフトウェアがなくても解凍できるようにすることができます。

次のセクションでは、Pythonのshutilモジュールを使用して実際にzip圧縮を行う手順について詳しく解説します。

shutilモジュールを使ったzip圧縮の手順

必要な準備

Pythonのインストール確認

まず、Pythonがインストールされていることを確認しましょう。

ターミナルやコマンドプロンプトで以下のコマンドを実行します。

python --version

このコマンドを実行すると、インストールされているPythonのバージョンが表示されます。

表示されない場合は、Pythonをインストールする必要があります。

必要なディレクトリとファイルの準備

次に、圧縮したいファイルやディレクトリを準備します。

例えば、以下のようなディレクトリ構造を持つ example_dir というディレクトリを用意します。

example_dir/
├── file1.txt
├── file2.txt
└── sub_dir/
    └── file3.txt

このディレクトリをzip圧縮することを目指します。

shutil.make_archive関数の使い方

shutilモジュールのmake_archive関数を使用して、ディレクトリをzip圧縮します。

この関数の基本的な使い方は以下の通りです。

import shutil
shutil.make_archive('archive_name', 'zip', 'example_dir')

このコードは、 example_dir ディレクトリを archive_name.zip という名前で圧縮します。

基本的な使い方

shutilモジュールを使ったzip圧縮の基本的な手順は以下の通りです。

  1. shutilモジュールをインポートする。
  2. make_archive関数を呼び出す。
  3. 圧縮したいディレクトリやファイルを指定する。

具体的なコード例は以下の通りです。

import shutil
# 圧縮するディレクトリのパス
directory_to_zip = 'example_dir'
# 圧縮後のファイル名(拡張子は自動で付与される)
output_filename = 'example_archive'
# 圧縮を実行
shutil.make_archive(output_filename, 'zip', directory_to_zip)

このコードを実行すると、 example_archive.zip というファイルが作成されます。

引数の説明

make_archive関数にはいくつかの引数があります。

これらの引数を理解することで、より柔軟に圧縮処理を行うことができます。

base_name

base_nameは、圧縮後のファイル名を指定します。

拡張子は自動的に付与されるため、指定する必要はありません。

format

formatは、圧縮形式を指定します。

一般的には zip を指定しますが、他にも targztar などが利用可能です。

root_dir

root_dirは、圧縮するディレクトリのルートパスを指定します。

通常は圧縮したいディレクトリのパスを指定します。

base_dir

base_dirは、root_dir内のどのディレクトリを圧縮するかを指定します。

デフォルトではroot_dir全体が圧縮されます。

verbose

verboseは、圧縮処理の詳細な情報を表示するかどうかを指定します。

デフォルトはFalseです。

dry_run

dry_runは、実際に圧縮を行わずに処理をシミュレートするかどうかを指定します。

デフォルトはFalseです。

owner

ownerは、圧縮ファイルの所有者を指定します。

デフォルトは現在のユーザーです。

group

groupは、圧縮ファイルのグループを指定します。

デフォルトは現在のグループです。

logger

loggerは、圧縮処理のログを記録するためのロガーオブジェクトを指定します。

デフォルトはNoneです。

これらの引数を適切に設定することで、様々な圧縮ニーズに対応することができます。

実際のコード例

単純なディレクトリの圧縮

まずは、shutilモジュールを使って単純なディレクトリを圧縮する方法を見ていきましょう。

ここでは、特定のディレクトリをzip形式で圧縮する基本的な手順を紹介します。

コード例

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

import shutil
# 圧縮するディレクトリのパス
dir_to_compress = 'example_dir'
# 出力するzipファイルの名前
output_filename = 'example'
# shutil.make_archiveを使ってディレクトリを圧縮
shutil.make_archive(output_filename, 'zip', dir_to_compress)

このコードでは、shutil.make_archive関数を使用して、example_dirディレクトリをexample.zipという名前のzipファイルに圧縮しています。

実行結果の確認

上記のコードを実行すると、カレントディレクトリにexample.zipというファイルが作成されます。

このファイルを解凍すると、元のexample_dirディレクトリの内容がそのまま含まれていることが確認できます。

特定のファイルのみを圧縮

次に、特定のファイルのみを圧縮する方法を見ていきましょう。

例えば、ディレクトリ内の特定の拡張子を持つファイルだけを圧縮したい場合などに役立ちます。

コード例

以下のコードは、example_dirディレクトリ内の.txtファイルのみをexample_txt.zipという名前のzipファイルに圧縮する例です。

import os
import zipfile
# 圧縮するディレクトリのパス
dir_to_compress = 'example_dir'
# 出力するzipファイルの名前
output_filename = 'example_txt.zip'
# zipファイルを作成
with zipfile.ZipFile(output_filename, 'w') as zipf:
    for root, dirs, files in os.walk(dir_to_compress):
        for file in files:
            if file.endswith('.txt'):
                # .txtファイルのみを追加
                zipf.write(os.path.join(root, file),
                           os.path.relpath(os.path.join(root, file),
                                           os.path.join(dir_to_compress, '..')))

このコードでは、os.walkを使ってディレクトリ内のファイルを再帰的に探索し、.txtファイルのみをzipfile.ZipFileを使って圧縮しています。

実行結果の確認

上記のコードを実行すると、カレントディレクトリにexample_txt.zipというファイルが作成されます。

このファイルを解凍すると、example_dirディレクトリ内の.txtファイルのみが含まれていることが確認できます。

以上が、shutilモジュールを使ったzip圧縮の基本的な方法と、特定のファイルのみを圧縮する方法です。

これらの方法を使って、効率的にファイルやディレクトリを圧縮することができます。

応用例

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

shutilモジュール自体には、圧縮ファイルにパスワードを設定する機能はありません。

しかし、Pythonには他にも多くのライブラリがあり、その中にはパスワード保護機能を持つものもあります。

例えば、zipfileモジュールやpyminizipライブラリを使用することで、パスワード保護されたzipファイルを作成することができます。

以下は、pyminizipを使用してパスワード保護されたzipファイルを作成する例です。

import pyminizip
# 圧縮するファイル
file_to_compress = "example.txt"
# 出力するzipファイルの名前
output_zip_file = "example.zip"
# パスワード
password = "your_password"
# 圧縮レベル(1-9)
compression_level = 5
pyminizip.compress(file_to_compress, None, output_zip_file, password, compression_level)

shutilモジュールではできないこと

shutilモジュールは非常に便利ですが、いくつかの制限があります。

例えば、以下のような機能はshutilモジュールではサポートされていません。

  • パスワード保護されたzipファイルの作成
  • 圧縮形式の選択(shutilはzip形式のみをサポート)
  • 圧縮ファイルの分割

これらの機能が必要な場合は、他のライブラリを併用する必要があります。

他のライブラリとの併用方法

shutilモジュールの制限を補うために、他のライブラリと併用することができます。

例えば、zipfileモジュールやpyminizipライブラリを使用することで、より高度な圧縮操作が可能になります。

以下は、zipfileモジュールを使用して複数のファイルを圧縮する例です。

import zipfile
# 圧縮するファイルのリスト
files_to_compress = ["file1.txt", "file2.txt"]
# 出力するzipファイルの名前
output_zip_file = "example.zip"
with zipfile.ZipFile(output_zip_file, 'w') as zipf:
    for file in files_to_compress:
        zipf.write(file)

圧縮ファイルの解凍

shutilモジュールには、圧縮ファイルを解凍するための関数も用意されています。

shutil.unpack_archive関数を使用することで、簡単に圧縮ファイルを解凍することができます。

shutil.unpack_archive関数の使い方

shutil.unpack_archive関数は、圧縮ファイルを指定したディレクトリに解凍するための関数です。

以下のように使用します。

import shutil
# 解凍するzipファイルの名前
zip_file = "example.zip"
# 解凍先のディレクトリ
extract_dir = "extracted_files"
shutil.unpack_archive(zip_file, extract_dir)

解凍のコード例

以下は、実際に圧縮ファイルを解凍するコード例です。

import shutil
# 解凍するzipファイルの名前
zip_file = "example.zip"
# 解凍先のディレクトリ
extract_dir = "extracted_files"
# 圧縮ファイルを解凍
shutil.unpack_archive(zip_file, extract_dir)
print(f"{zip_file} を {extract_dir} に解凍しました。")

このコードを実行すると、example.zipファイルがextracted_filesディレクトリに解凍されます。

解凍が成功すると、指定したディレクトリに圧縮されていたファイルが展開されます。

以上が、shutilモジュールを使用したzip圧縮と解凍の基本的な方法と応用例です。

shutilモジュールは非常に便利で、簡単にファイル操作を行うことができますが、必要に応じて他のライブラリと併用することで、より高度な操作も可能になります。

目次から探す