この記事では、Pythonでファイルやフォルダのコピー、移動、名前の変更、削除といった高レベルなファイル操作を行うための標準ライブラリ、shutilモジュールについて解説します。
ファイルとフォルダのコピー
shutilモジュールは、ファイルやフォルダを簡単にコピーするための関数を提供します。
shutil.copy(source, destination) この関数は、sourceパスにあるファイルをdestinationパスにコピーします。destinationがフォルダの場合、そのフォルダ内に同じファイル名でコピーされます。destinationにファイル名を指定すれば、コピーと同時に名前を変更することもできます。
import shutil
from pathlib import Path
# 作業用のディレクトリとファイルを準備
source_dir = Path("project_alpha")
source_dir.mkdir(exist_ok=True)
(source_dir / "report.txt").write_text("This is a report.")
dest_dir = Path("project_beta")
dest_dir.mkdir(exist_ok=True)
# ファイルを別のフォルダにコピー
shutil.copy(source_dir / "report.txt", dest_dir)
# コピーと同時に名前を変更
shutil.copy(source_dir / "report.txt", dest_dir / "report_final.txt")
shutil.copytree(source, destination) この関数は、sourceフォルダとその中に含まれるすべてのファイルとサブフォルダを、destinationに再帰的にコピーします。フォルダのバックアップを作成する際に便利です。
Python
# project_alphaフォルダ全体をbackupフォルダにコピー
# shutil.copytree(source_dir, "backup")
ファイルとフォルダの移動と名前の変更
shutil.move(source, destination) この関数は、ファイルやフォルダをsourceからdestinationへ移動します。この一つの関数で、移動と名前の変更の両方の役割を果たします。
import shutil
from pathlib import Path
# workフォルダとmove_toフォルダ、およびファイルを準備
Path("work").mkdir(exist_ok=True)
Path("move_to").mkdir(exist_ok=True)
(Path("work") / "data.csv").write_text("a,b,c")
# 1. ファイルを別のフォルダに移動
shutil.move(Path("work/data.csv"), Path("move_to"))
# 2. ファイルの名前を変更 (同じフォルダ内で移動)
# (Path("move_to/data.csv")).rename(Path("move_to/data_renamed.csv"))
# 3. 移動と名前の変更を同時に行う
# shutil.move(Path("move_to/data_renamed.csv"), Path("work/new_data.csv"))
存在しないフォルダをdestinationに指定するとエラーになります。
ファイルとフォルダの削除
Pythonにはファイルを削除する方法がいくつかありますが、その危険度に応じて使い分けることが重要です。
os.unlink(path) または pathlib.Path.unlink() この方法は、ファイルを完全に削除します。一度削除すると元に戻すことはできません。
from pathlib import Path
# 削除するファイルを準備
Path("temp_notes.txt").write_text("temporary note")
Path("temp_log.txt").write_text("temporary log")
# カレントディレクトリ内の.txtファイルをすべて削除
for file_path in Path('.').glob('*.txt'):
if file_path.is_file():
# file_path.unlink() # 実行するとファイルが完全に削除される
print(f"{file_path}を削除しました。")
shutil.rmtree(path) この関数は、指定したフォルダとその中のすべてのファイルとサブフォルダを完全に、そして再帰的に削除します。非常に強力ですが、誤って使うと大きな損害につながる可能性があるため、使用には細心の注意が必要です。
send2trashモジュールによる安全な削除 os.unlinkやshutil.rmtreeと異なり、send2trashはファイルを完全に削除するのではなく、OSのごみ箱に移動させます。これにより、誤って削除した場合でも元に戻すことができます。
send2trashはサードパーティ製のライブラリなので、使用前にインストールが必要です。 pip install send2trash
import send2trash
# 削除するファイルを準備
bacon_file = Path("bacon.txt")
bacon_file.write_text("Bacon is not a vegetable.")
# ファイルをごみ箱に移動
send2trash.send2trash("bacon.txt")
print("bacon.txtをごみ箱に移動しました。")
まとめ
ファイル操作にはshutilモジュールが多くの高レベルな機能を提供します。shutil.copy()やshutil.copytree()でコピー、shutil.move()で移動や名前の変更が可能です。ファイルの削除にはos.unlink()やshutil.rmtree()がありますが、これらはデータを復元不可能にするため危険が伴います。より安全な代替手段として、ファイルをごみ箱に送るsend2trashモジュールの使用が推奨されます。
