Pythonでファイルやディレクトリのコピー・移動・削除を行うには、shutil モジュールが便利と知り、基本的な使い方を試してみました。
この記事は、学習の記録として shutil の基本的な関数や、関連モジュールとの違いを整理したものです。
shutilとは?
shutil(シェル・ユーティリティ)は、ファイルやディレクトリのコピー・移動・削除などを簡単に行える標準モジュールです。
よく使う操作を1行で書けるため、手間を減らしたいときに便利です。
ファイルをコピーする(copy, copy2)
shutil.copy()
import shutil
# "sample.txt" を "copy.txt" にコピー(中身のみ)
shutil.copy("sample.txt", "copy.txt")
→ ファイルの内容はコピーされますが、作成日・更新日時などの情報(メタ情報)はコピーされません。
shutil.copy2()
import shutil
# メタ情報も含めてコピー
shutil.copy2("sample.txt", "copy2.txt")
→ copy2() は、copy() と同じようにファイルをコピーしますが、タイムスタンプなどのメタ情報も含めてコピーされます。
ディレクトリをコピーする(copytree)
import shutil
# "src_dir" を "dest_dir" にまるごとコピー
shutil.copytree("src_dir", "dest_dir")
注意点:dest_dir がすでに存在しているとエラーになります。
ファイルやディレクトリを移動する(move)
import shutil
# ファイルやディレクトリを移動(または名前変更)
shutil.move("old_name.txt", "new_name.txt")
ファイルのリネームや、ディレクトリの移動にも使えます。
ディレクトリを削除する(rmtree)
import shutil
# フォルダを中身ごと削除
shutil.rmtree("temp_folder")
os.rmdir() だと中身があると削除できませんが、rmtree() は中身ごとまとめて削除してくれます。
shutilとcopyモジュールの違い
Pythonには copy モジュールもありますが、これはPythonオブジェクト(リストや辞書など)をコピーするもので、shutil とは用途がまったく異なります。
| モジュール | 主な用途 | 対象 | 例 |
|---|---|---|---|
shutil |
ファイル・フォルダの操作 | 実在するファイルやディレクトリ | shutil.copy("a.txt", "b.txt") |
copy |
オブジェクトのコピー | メモリ上のリストや辞書など | copy.copy([1, 2, 3]) |
具体例の比較
# ファイルのコピー(shutil)
import shutil
shutil.copy("test.txt", "backup.txt")
# リストのコピー(copy)
import copy
original = [1, 2, 3]
cloned = copy.copy(original)
copy.copy("test.txt")と書いてもファイルはコピーされません。
文字列オブジェクトを複製するだけです。
shutilとosモジュールの違い
os モジュールもファイルやディレクトリ操作に使えますが、shutil はより高レベルの処理(コピー・移動・再帰削除など)に特化しています。
| モジュール | 主な用途 | 対象 | 備考 |
|---|---|---|---|
os |
基本操作(作成・削除・確認など) | ファイルやディレクトリ | 手続きが細かいこともある |
shutil |
高レベルな操作(コピー・移動など) | ファイルやディレクトリ | まとめて処理できて簡単 |
比較例
# ディレクトリ作成(os)
import os
os.mkdir("new_folder")
# ファイルコピー(shutil)
import shutil
shutil.copy("a.txt", "b.txt")
# ディレクトリごと削除(shutil)
shutil.rmtree("folder_to_delete")
ファイルの存在確認・作成などの細かい操作は
os、コピーや移動はshutilを使うと覚えておくと良さそうです。
おわりに
shutil を使うと、ファイルやフォルダのコピー・削除・移動がとても簡単にできることが分かりました。
また、copy や os との違いを知っておくことで、状況に応じて正しいモジュールを使い分けることができそうです。
今後はこれらを活用して、バックアップスクリプトなどにもチャレンジしてみたいと思います。