【Python】ディレクトリを削除する方法!shutil.rmtree()の使い方!

この記事では、Pythonのディレクトリ(フォルダ)を削除する関数『shutil.rmtree()』について、以下の内容を詳しく説明します。

  • shutil.rmtree()とは
  • shutil.rmtree()の構文
  • shutil.rmtree()の使い方
    • 既存のディレクトリを削除する方法
  • shutil.rmtree()のオプション
    • ignore_errors引数
    • onerror引数
  • shutil.rmtree()の注意点
    • shutil.rmtree()の引数に存在しないディレクトリパスを指定するとエラーになる
    • shutil.rmtree()の引数にファイルパスを指定するとエラーになる

などをサンプルコードを用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

shutil.rmtree()とは

shutil.rmtree()は、Pythonの標準ライブラリshutilに含まれる関数で、ディレクトリ(フォルダ)を削除する際に使用されます。この関数を使うと、指定したディレクトリとその中のすべてのファイルとサブディレクトリを一括で削除することができます。

後ほどshutil.rmtree()の構文や使い方について詳しく説明しますが、まず以下に示す簡単なサンプルコードを見てみましょう。

import shutil

# 削除するディレクトリパス
path = 'testdir/dir'

# shutil.rmtree()でtestdir/dirディレクトリを削除する
shutil.rmtree(path)

上記のサンプルコードを実行すると、testdir/dirディレクトリとその中のすべてのファイルとサブディレクトリが削除されます。

公式ドキュメント

shutil.rmtree()の公式ドキュメントのリンクを以下に示します。

この記事ではshutil.rmtree()の「使い方」や「オプション」についてできる限り分かりやすく説明しています。これらの関数の詳細を知りたい方は、公式ドキュメントをご覧ください。

shutil.rmtree()の構文

shutil.rmtree()の構文を以下に示します。

構文

shutil.rmtree(path, ignore_errors=False, onerror=None)

shutil.rmtree()の引数と返り値を以下に示します。

引数

  • path
    • 削除するディレクトリのパスです。
  • ignore_errors(省略可能)
    • エラーを無視するかどうかを指定します。デフォルトはFalseです。
    • Trueに設定すると、エラーが発生しても無視して処理を続行します。
  • onerror(省略可能)
    • エラーが発生したときに呼び出される関数を指定します。デフォルトはNoneです。
    • この関数は、エラー発生時に特定の処理を行いたい場合に使用します。

返り値(戻り値)

  • shutil.rmtree()は返り値を持ちません。

shutil.rmtree()の使い方

以下のディレクトリ構造とします。

testdir/
└── dir/
    ├── subdir/
    │   └── file1.txt
    └── file2.txt

このディレクトリ構成で、shutil.rmtree()について、以下に示している使い方をこれから説明します。

  • 既存のディレクトリを削除する方法

上記の使い方について順番に説明します。

既存のディレクトリを削除する方法

shutil.rmtree()の第1引数pathに既存のディレクトリパス(存在するディレクトリのパス)を指定すると、そのディレクトリとその中のすべてのファイルとサブディレクトリを削除することができます。

サンプルコード

import shutil

# 削除するディレクトリパス
path = 'testdir/dir'

# testdir/dirディレクトリを削除する
shutil.rmtree(path)

上記のサンプルコード実行後のディレクトリ構成

testdir/

上記のサンプルコードを実行すると、testdir/dirディレクトリとその中のすべてのファイルとサブディレクトリが削除されます。なお、ディレクトリ指定時の末尾の区切り文字(/)はあってもなくても構いません。そのため、path = 'testdir/dir/'のように指定しても大丈夫です。

shutil.rmtree()のオプション

shutil.rmtree()に使用できる以下のオプションについて順番に詳しく説明します。

  • ignore_errors引数
  • onerror引数

ignore_errors引数

ignore_errorsはエラー発生時にそのエラーを無視するかどうかを指定する引数です。デフォルトはFalseであり、この場合、エラーが発生するとディレクトリの削除を終了します。Trueを指定すると、エラーを無視してディレクトリを削除します。

まず、ignore_errorsを指定しない場合(またはFalseを指定した場合)の動作について確認してみましょう。ディレクトリやファイルが読み取り専用である場合や、他のプロセスによってロックされている場合にエラーが発生します。以下のサンプルコードでは、testdir/dir/file2.txtのファイルを読み取り専用にすることで、エラーを発生させています。

サンプルコード

import os
import stat
import shutil

# 削除するディレクトリパス
path = 'testdir/dir'

# ファイルを読み取り専用に設定
os.chmod('testdir/dir/file2.txt', stat.S_IREAD)

# 読み取り専用のファイルがある場合には、エラーが発生する
shutil.rmtree(path)

エラーメッセージ

PermissionError: [WinError 5] アクセスが拒否されました。: 'testdir/dir\\file2.txt'

上記のサンプルコード実行後のディレクトリ構成

testdir/
└── dir/
    └── file2.txt ← エラーが発生し、ディレクトリの削除が終了する

ignore_errors=Trueを設定すると、エラーが発生しなくなります。サンプルコードを以下に示します。

サンプルコード

import os
import stat
import shutil

# 削除するディレクトリパス
path = 'testdir/dir'

# ファイルを読み取り専用に設定
os.chmod('testdir/dir/file2.txt', stat.S_IREAD)

# ignore_errors=Trueを指定すると、エラーを無視して削除を続行する
shutil.rmtree(path, ignore_errors=True)

上記のサンプルコード実行後のディレクトリ構成

testdir/
└── dir/
    └── file2.txt ← エラーは発生しないが、読み取り専用のファイルは残る

onerror引数

onerrorはエラーが発生したときに呼び出される関数を指定する引数です。デフォルトはNoneです。エラー発生時に呼び出される関数は以下に示す3つの引数を取ります。

  • func: エラーが発生した関数
  • path: その関数が処理していたパス
  • excinfo: 例外情報

サンプルコード

import shutil

def handle_remove_error(func, path, excinfo):
    print("func",func)
    print("path",path)
    print("excinfo",excinfo)

# 削除するディレクトリパス(存在しないディレクトリパスを指定)
path = 'testdir/hogehoge'

# testdir/hogehogeディレクトリを削除する際に、エラーが発生したらhandle_remove_errorを呼び出す
shutil.rmtree(path, onerror=handle_remove_error)

# 出力結果
# func <built-in function rmdir>
# path testdir/hogehoge
# excinfo (<class 'FileNotFoundError'>, FileNotFoundError(2, '指定されたファイルが見つかりません。'), <traceback object at 0x0000029CEC6AC540>)

この例では、エラーが発生した場合にhandle_remove_error関数が呼び出され、エラーメッセージが表示されます。

shutil.rmtree()の注意点

shutil.rmtree()の注意点を以下に示します。

  • shutil.rmtree()の引数に存在しないディレクトリパスを指定するとエラーになる
  • shutil.rmtree()の引数にファイルパスを指定するとエラーになる

各注意点について順番に説明します。

shutil.rmtree()の引数に存在しないディレクトリパスを指定するとエラーになる

存在しないディレクトリをshutil.rmtree()の引数に指定すると、FileNotFoundErrorが発生します。

サンプルコード

import shutil

# 削除するディレクトリパス(存在しないディレクトリパスを指定)
path = 'testdir/hogehoge'

shutil.rmtree(path)

エラーメッセージ

FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: 'testdir/hogehoge'

この場合、事前にディレクトリが存在するかどうかを確認することが推奨されます。以下にサンプルコードを以下に示します。

サンプルコード

import shutil
import os

# 削除するディレクトリパス(存在しないディレクトリパスを指定)
path = 'testdir/hogehoge'

# 事前にディレクトリが存在するかどうかを確認
if os.path.exists(path):
    shutil.rmtree(path)
else:
    print(f"The directory {path} does not exist.")

# 出力結果
# The directory testdir/hogehoge does not exist.

このサンプルコードでは、削除対象のディレクトリが存在するかどうかをチェックし、存在する場合にのみ削除を実行しています。

shutil.rmtree()の引数にファイルパスを指定するとエラーになる

shutil.rmtree()の引数として指定できるのはディレクトリパスのみです。ファイルパスを指定するとエラーが発生します。

サンプルコード

import shutil

# ファイルパスを指定
path = 'testdir/dir/file2.txt'

shutil.rmtree(path)

エラーメッセージ

NotADirectoryError: [WinError 267] ディレクトリ名が無効です。: 'testdir/dir/file2.txt'

本記事のまとめ

この記事では、Pythonのディレクトリ(フォルダ)を削除する関数『shutil.rmtree()』について、以下の内容を説明しました。

  • shutil.rmtree()とは
  • shutil.rmtree()の構文
  • shutil.rmtree()の使い方
    • 既存のディレクトリを削除する方法
  • shutil.rmtree()のオプション
    • ignore_errors引数
    • onerror引数
  • shutil.rmtree()の注意点
    • shutil.rmtree()の引数に存在しないディレクトリパスを指定するとエラーになる
    • shutil.rmtree()の引数にファイルパスを指定するとエラーになる

お読み頂きありがとうございました。