Pythonのより高度なファイル、フォルダ操作ができるshutilモジュール その4:フォルダの削除 shutil.rmtree

スポンサーリンク

前回のおさらい

過去6回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。

前回はファイル・フォルダの移動、名前の変更をするshutil.moveを解説しました。

Pythonのより高度なファイル、フォルダ操作ができるshutilモジュール その3:ファイル・フォルダの移動・名前の変更 shutil.move
前回のおさらい過去5回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。前回はshutilモジュールのうち、フォルダをコピーする方法 shutil.copytr...

今回はshutilモジュールを使って、フォルダを削除する方法を解説していきます。

前回もshutil.moveを使って、ファイル・フォルダを色々と動かしたので、ファイル・フォルダ構造はこうなっているかと思います。

今回もこのまま使っていきましょう。

Pythonプログラムはos_module_test内に新しいものを作成し、shutilモジュールをインポートしておきます。

import shutil

それでは始めていきましょう。

スポンサーリンク

フォルダの削除:shutil.rmtree(“フォルダ名”)

shutilモジュールを使って、フォルダを削除するにはshutil.rmtree(“フォルダ名”)を用います。

まずはファイルということでfolder1を削除してみましょう。

shutil.rmtree("folder1")

削除することができました。

スポンサーリンク

shutil.rmtreeはフォルダに何か入っていても削除できるのか?

次にshutil.rmtreeはフォルダに何かファイルなどが入っていても削除できるか試してみましょう。

folder3にはdocument1.txt、document2.txt、document3.txtが入っているので、このフォルダを削除してみましょう。

shutil.rmtree("folder3")

フォルダの中にファイルが入っていても問題なく削除できました。

スポンサーリンク

shutil.rmtreeはファイルも削除できる?

それではshutil.rmtreeは単体のファイルも削除できるか試してみましょう。

都合よくdocument5.txtが単体で残っていますので、こちらを削除してみましょう。

shutil.rmtree("document5.txt")

実行結果
---------------------------------------------------------------------------
NotADirectoryError                        Traceback (most recent call last)
<ipython-input-9-6865b30eb2b4> in <module>
----> 1 shutil.rmtree("document5.txt")

/opt/anaconda3/lib/python3.7/shutil.py in rmtree(path, ignore_errors, onerror)
    492         try:
    493             if os.path.samestat(orig_st, os.fstat(fd)):
--> 494                 _rmtree_safe_fd(fd, path, onerror)
    495                 try:
    496                     os.rmdir(path)

/opt/anaconda3/lib/python3.7/shutil.py in _rmtree_safe_fd(topfd, path, onerror)
    411     except OSError as err:
    412         err.filename = path
--> 413         onerror(os.scandir, path, sys.exc_info())
    414         return
    415     for entry in entries:

/opt/anaconda3/lib/python3.7/shutil.py in _rmtree_safe_fd(topfd, path, onerror)
    407 def _rmtree_safe_fd(topfd, path, onerror):
    408     try:
--> 409         with os.scandir(topfd) as scandir_it:
    410             entries = list(scandir_it)
    411     except OSError as err:

NotADirectoryError: [Errno 20] Not a directory: 'document5.txt'

document5.txtはフォルダではないので削除できないとエラーが出てきました。

ということでshutil.rmtreeの対象としてはフォルダしか指定できないということです。

しかし先ほど試した通り、フォルダを指定すれば、フォルダ内にあるファイルは削除できます。

スポンサーリンク

フォルダを指定しなかった場合

ちなみにos.removeやos.rmdir、shutil.rmtreeのようにPythonのプログラムからファイルやフォルダを削除すると、ゴミ箱に入らずに削除されてしまいます。

ということはやり直しが効かないということです。

os.removeであればファイル単体ですし、os.rmdirであれば中にファイルが入っていればフォルダを削除できないのでまだ安心です。

shutil.rmtreeは今回試した通り、ファイルがあろうがなかろうが削除してしまうので注意が必要になります。

ではshutil.rmtreeのフォルダ名を指定しなかった場合、どうなるでしょうか?

最悪の場合、パソコンの中身全てが消されてしまうと考えられます。

ということでちょっとビクビクしながら試してみました。

shutil.rmtree()

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-9cc5f9fe51d2> in <module>
----> 1 shutil.rmtree()

TypeError: rmtree() missing 1 required positional argument: 'path'

shutil.rmtreeのフォルダ名は必ず指定しなければいけない値(必須引数)であるため、エラーが表示されました。

これなら間違えて実行してしまってもちょっと安心です。

ですが間違えてもシステムのフォルダなんかを指定しない様に注意してください。

流石に私もそこまで試す度胸はないので、例は勘弁してください。

ちなみに必須引数に関しては、こちらの記事で解説していますので、良かったらこちらもどうぞ。

Pythonで自分で関数を定義する方法 その2 〜オプション引数と必須引数〜
def文前に自分で関数を定義する方法としてdef文を紹介しました。今回はdef文をもっと使っていくためにオプション引数に関して解説していきます。またdef文における必須引数、オプション引数が混ざっている時の...

次回はとうとうos.モジュールとshutilモジュールのまとめと比較をしていきたいと思います。

ということで今回はこんな感じで。

コメント

タイトルとURLをコピーしました