おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初級者のお勉強ノート(15)shutilモジュール

Pythonshutilモジュールを使ったファイルとディレクトリ操作の基本

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()

ディレクトリを圧縮してアーカイブを作成し、アーカイブのファイル名を返します。 アーカイブ形式に対応する拡張子を自動的につけます。

この関数には以下の引数があります:

利用可能なアーカイブ形式は次の通りです: - '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_diroutput_archive.zipとしてアーカイブします。

python ar-1.py +a example_dir output_archive

実行結果: - example_diroutput_archive.zipという名前でアーカイブ化されます。

アーカイブファイルの解凍

次のコマンドでoutput_archive.zipextracted_dirに解凍します。

python ar-1.py -a output_archive.zip extracted_dir

実行結果: - output_archive.zipの内容がextracted_dirというディレクトリに展開されます。

まとめ

本記事では、以下の内容を学びました。

  1. shutilモジュールの概要と基本的な使い方
  2. ファイルやディレクトリのコピー、移動、削除
  3. アーカイブの作成と解凍(形式や引数の詳細を含む)
  4. コマンドラインツールとしてのアーカイブ作成スクリプト

shutilモジュールは、Pythonでファイルやディレクトリを操作する際の強力なツールです。 特にバックアップやアーカイブ化などに役立ちます。