Pythonのshutil
モジュールを使ったファイルとディレクトリ操作の基本
Pythonでファイルやディレクトリの操作を行う際、os
モジュールに加えて便利なのがshutil
モジュールです。
shutil
は、ファイルやディレクトリのコピー、移動、削除、アーカイブ化など、より高レベルな操作を簡単に行うための標準モジュールです。
この記事では、shutil
モジュールの基本的な使い方や、具体的なユースケースについて解説します。
shutil
モジュールとは?
shutil
モジュールは、ファイルやディレクトリの操作を効率化するための機能を提供します。
os
モジュールが低レベルなシステム操作に焦点を当てているのに対し、shutil
モジュールは高レベルな操作に適しています。
例えば、以下のようなタスクを簡単に実現できます。
基本的な使い方
ファイルやディレクトリのコピー
shutil.copy()
単一のファイルをコピーします。 この関数は、ファイルの内容とパーミッションをコピーしますが、すべてのメタデータをコピーするわけではありません。
以下の例で「source」はコピー元「destination」はコピー先を表します。
import shutil shutil.copy('source.txt', 'destination.txt')
shutil.copytree()
shutil.copytree('source_dir', 'destination_dir')
ファイルやディレクトリの移動
shutil.move()
ファイルまたはディレクトリを移動します。 この関数は、移動元のファイルを削除し、新しい場所にファイルを作成します。
shutil.move('source.txt', 'new_directory/source.txt')
ファイルやディレクトリの削除
shutil.rmtree()
ディレクトリ全体を削除します。 ディレクトリが空でなくても削除できるため、使用する際は注意が必要です。
shutil.rmtree('directory_to_delete')
ディスク容量の確認
shutil.disk_usage()
ディスクの使用状況(総容量、使用済み容量、空き容量)を取得します。
usage = shutil.disk_usage('/') print(f"総容量: {usage.total // (1024**3)} GB") print(f"使用済み: {usage.used // (1024**3)} GB") print(f"空き容量: {usage.free // (1024**3)} GB")
/
はLinuxなどの「ルート」、すなわち、そのシステムの入っているディスクのトップディレクトリ、またはディスクそのものを表します。
このプログラムはWindowsでも動きますが、Windowsのシステムの入っているディスクはC:
またはC:\\
と表します。
Windowsでは、usage = shutil.disk_usage('C:\\')
などでも動作します。
ファイルやディレクトリのアーカイブ
shutil.make_archive()
ディレクトリを圧縮してアーカイブを作成し、アーカイブのファイル名を返します。 アーカイブ形式に対応する拡張子を自動的につけます。
この関数には以下の引数があります:
- 第1引数(base_name): 作成するアーカイブファイルの名前(拡張子を含まない部分)。パスを含む指定も可能。
- 第2引数(format): アーカイブの形式(例:
'zip'
,'tar'
)。利用可能な形式は以下を参照。 - 第3引数(root_dir): アーカイブファイルのルートとなるディレクトリ。アーカイブに含まれる全てのパスは root_dir からの相対パスになる。デフォルトはカレント・ディレクトリ。
- 第4引数(base_dir): アーカイブを開始するディレクトリまたは、ファイル。すなわち、
base_dir
以下のファイルとディレクトリがアーカイブされる。base_dir
はroot_dir
からの相対パス。デフォルトはroot_dir
。
利用可能なアーカイブ形式は次の通りです:
- 'zip'
- 'tar'
- 'gztar'
(gzip圧縮されたtarアーカイブ)
- 'bztar'
(bzip2圧縮されたtarアーカイブ)
- 'xztar'
(xz圧縮されたtarアーカイブ)
shutil.unpack_archive()
アーカイブを解凍します。
次の例では、make_archive
で作成し、そのアーカイブを解凍します。
import shutil # アーカイブを作成 archive_path = shutil.make_archive('example_archive', 'zip', 'source_dir') # アーカイブを解凍 extract_path = 'extracted_dir' shutil.unpack_archive(archive_path, extract_path)
このコードでは、source_dir
を圧縮してexample_archive.zip
を作成し、それをextracted_dir
に解凍しています。
応用例: コマンドラインからディレクトリのアーカイブおよび解凍
以下は、コマンドライン引数を使用して指定されたディレクトリをzipアーカイブしたり、アーカイブファイルを解凍したりするスクリプトです。ユーザーは、オプションによって操作を選択できます。
import shutil import sys from pathlib import Path def archive_directory(directory, output_name): directory = Path(directory) if not directory.is_dir(): print(f"エラー: {directory} が存在しないか、またはディレクトリではありません") return # アーカイブ作成 archive_path = shutil.make_archive(output_name, 'zip', directory) print(f"アーカイブを作成しました: {archive_path}") def extract_archive(archive_file, output_dir): archive_file = Path(archive_file) output_dir = Path(output_dir) if not archive_file.exists(): print(f"エラー: {archive_file} が存在しません") return # アーカイブ解凍 shutil.unpack_archive(archive_file, output_dir) print(f"アーカイブを解凍しました: {output_dir}") def usage(): print("使用方法:") print(" アーカイブ作成: python script.py +a <ディレクトリ名> <出力ファイル名>") print(" アーカイブ解凍: python script.py -a <アーカイブファイル名> <解凍先ディレクトリ>") if len(sys.argv) != 4: usage() sys.exit(1) option = sys.argv[1] if option == "+a": directory = sys.argv[2] output_name = sys.argv[3] archive_directory(directory, output_name) elif option == "-a": archive_file = sys.argv[2] output_dir = sys.argv[3] extract_archive(archive_file, output_dir) else: usage() sys.exit(1)
使用例
上記のプログラムをar-1.py
という名前で保存します。
ディレクトリのアーカイブ
端末を起動します。
次のコマンドでexample_dir
をoutput_archive.zip
としてアーカイブします。
python ar-1.py +a example_dir output_archive
実行結果:
- example_dir
がoutput_archive.zip
という名前でアーカイブ化されます。
アーカイブファイルの解凍
次のコマンドでoutput_archive.zip
をextracted_dir
に解凍します。
python ar-1.py -a output_archive.zip extracted_dir
実行結果:
- output_archive.zip
の内容がextracted_dir
というディレクトリに展開されます。
まとめ
本記事では、以下の内容を学びました。
shutil
モジュールは、Pythonでファイルやディレクトリを操作する際の強力なツールです。
特にバックアップやアーカイブ化などに役立ちます。