ファイルの整理やログのローテーション、バックアップ処理などにおいて、ファイルやディレクトリを別の場所に移動させたい場面は頻繁に発生します。
Pythonでこれを行うには、標準ライブラリ shutil モジュールの move() 関数を使用するのが最も一般的で確実な方法です。この関数は、単なる移動だけでなく、ファイル名の変更(リネーム)にも対応しており、異なるドライブ間の移動も自動的に処理してくれます。
この記事では、shutil.move() を使ったファイルとディレクトリの移動方法について解説します。
shutil.move() の基本的な使い方
shutil モジュールをインポートし、move(移動元, 移動先) の形式で呼び出します。
構文:
import shutil
shutil.move(src, dst)
src(Source): 移動したいファイルまたはディレクトリのパス。dst(Destination): 移動先のパス(ディレクトリ名、または新しいファイル名)。
具体的な使用例
1. ファイルを別のディレクトリへ移動する
ファイルを既存のディレクトリの中に移動するケースです。
import shutil
import os
# 移動元のファイルと、移動先のディレクトリ
source_file = "downloads/report_2025.pdf"
destination_dir = "documents/reports/"
print(f"移動前: {source_file}")
# ファイルをディレクトリへ移動
# documents/reports/report_2025.pdf となる
try:
new_path = shutil.move(source_file, destination_dir)
print(f"移動完了: {new_path}")
except FileNotFoundError:
print("エラー: 移動元のファイルが見つかりません。")
実行結果:
移動前: downloads/report_2025.pdf
移動完了: documents/reports/report_2025.pdf
移動先の dst がディレクトリの場合、その中に同じファイル名で保存されます。
2. ファイル名を変更して移動する(リネーム)
移動と同時にファイル名を変更したい場合は、dst に新しいファイルパス(ファイル名まで含む)を指定します。
同じディレクトリ内で名前を変えれば、単なる「リネーム」操作になります。
import shutil
# 古い設定ファイル
old_config = "config_v1.json"
# バックアップ用の新しい名前(ディレクトリ移動と同時にリネームも可)
new_config = "backup/config_v1_old.json"
# 移動とリネームを実行
shutil.move(old_config, new_config)
print(f"'{old_config}' を '{new_config}' に変更しました。")
3. ディレクトリごと移動する
shutil.move() は、ファイルだけでなくディレクトリに対しても全く同じように機能します。
import shutil
# プロジェクトフォルダ全体
project_dir = "temp_project"
# アーカイブフォルダ
archive_dir = "archive"
# ディレクトリごと移動
# archive/temp_project という階層になる
shutil.move(project_dir, archive_dir)
print(f"ディレクトリ '{project_dir}' を '{archive_dir}' へ移動しました。")
os.rename() との違い
ファイル移動には os.rename() という関数も存在しますが、shutil.move() の使用が推奨される主な理由は以下の通りです。
- 異なるファイルシステム間の移動:
os.rename()は、CドライブからDドライブへといった「異なるディスク/パーティション間」の移動に失敗する場合があります。一方、shutil.move()は、移動が不可能な場合に自動的に「コピーしてから元ファイルを削除する」という処理に切り替えてくれるため、環境を意識せずに使用できます。
注意点:上書きの挙動
移動先に既に同名のファイルが存在する場合の挙動は、OSによって異なる場合があります。
- Unix/Linux/macOS: 基本的に黙って上書きされます。
- Windows:
dstが同名のファイルだとエラーになる場合があります。
確実に上書きしたい、あるいは上書きを防ぎたい場合は、事前に os.path.exists() で確認する処理を入れることが重要です。
まとめ
- ファイルやディレクトリの移動には
shutil.move(src, dst)を使用します。 dstがディレクトリならその中へ、ファイルパスならその名前で移動(リネーム)されます。- ディレクトリごとの移動も可能です。
os.rename()よりも高機能で、異なるドライブ間の移動もサポートしています。
