ファイル操作を行うプログラムでは、不要になった一時ファイルや、古いデータを格納したディレクトリを削除する処理が必要になります。
Pythonでは、削除対象が「ファイル」なのか「ディレクトリ(フォルダ)」なのかによって、使用する関数が異なります。
この記事では、ファイルを削除する os.remove() と、ディレクトリを中身ごと削除する shutil.rmtree() の使い方、および安全な削除のための注意点について解説します。
1. ファイルを削除する: os.remove()
単一のファイルを削除するには、標準ライブラリ os モジュールの remove() 関数を使用します。
構文:
import os
os.remove(ファイルパス)
具体的な使用例
処理が完了した後に、不要になった一時ファイルを削除する例です。
import os
# 削除対象のファイル
target_file = "temp_data.csv"
print(f"処理対象: {target_file}")
try:
# ファイルを削除
os.remove(target_file)
print("ファイルを削除しました。")
except FileNotFoundError:
# ファイルが存在しない場合のエラー処理
print("エラー: ファイルが見つかりませんでした。")
except PermissionError:
# ファイルが開かれている場合などのエラー処理
print("エラー: ファイルを削除する権限がありません(使用中である可能性があります)。")
実行結果(ファイルが存在する場合):
処理対象: temp_data.csv
ファイルを削除しました。
注意点
- ディレクトリは削除できません:
os.remove()にディレクトリのパスを指定すると、IsADirectoryError(またはPermissionError)が発生します。 - ゴミ箱には入りません: この関数で削除したファイルは、ゴミ箱を経由せずに完全に削除されます。復元は困難なため、パスの指定には十分な注意が必要です。
2. 空のディレクトリを削除する: os.rmdir()
中身が空のディレクトリを削除したい場合は、os.rmdir() 関数を使用します。
import os
empty_dir = "empty_folder"
try:
os.rmdir(empty_dir)
print(f"ディレクトリ '{empty_dir}' を削除しました。")
except OSError as e:
print(f"削除できませんでした: {e}")
ディレクトリの中にファイルやサブディレクトリが一つでも残っていると、OSError(ディレクトリが空ではありません)が発生し、削除できません。
3. ディレクトリを中身ごと削除する: shutil.rmtree()
ファイルやサブディレクトリが含まれているディレクトリを、中身ごとまとめて削除したい場合は、標準ライブラリ shutil モジュールの rmtree() 関数を使用します。
これは、Unixコマンドの rm -rf に相当する強力な操作です。
構文:
import shutil
shutil.rmtree(ディレクトリパス)
具体的な使用例
キャッシュファイルが溜まったディレクトリを、一括で削除(クリーンアップ)する例です。
import shutil
import os
# 削除対象のディレクトリ(中身があってもOK)
cache_dir = "app_cache"
print(f"'{cache_dir}' の削除を開始します...")
if os.path.exists(cache_dir):
try:
# ディレクトリツリー全体を削除
shutil.rmtree(cache_dir)
print("削除が完了しました。")
except Exception as e:
print(f"予期せぬエラーが発生しました: {e}")
else:
print("削除対象のディレクトリが存在しません。")
実行結果:
'app_cache' の削除を開始します...
削除が完了しました。
この操作も os.remove() と同様に、削除されたデータは元に戻せません。特に shutil.rmtree() は広範囲のデータを一瞬で消去するため、対象パスが正しいかどうかを os.path.exists() 等で慎重に確認してから実行することを推奨します。
まとめ
削除対象に応じて、適切な関数を選択します。
- ファイルを削除する:
os.remove(path) - 空のディレクトリを削除する:
os.rmdir(path) - 中身ごとのディレクトリを削除する:
shutil.rmtree(path)
