前回のおさらい
過去6回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。
前回はファイル・フォルダの移動、名前の変更をするshutil.moveを解説しました。

今回は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のフォルダ名は必ず指定しなければいけない値(必須引数)であるため、エラーが表示されました。
これなら間違えて実行してしまってもちょっと安心です。
ですが間違えてもシステムのフォルダなんかを指定しない様に注意してください。
流石に私もそこまで試す度胸はないので、例は勘弁してください。
ちなみに必須引数に関しては、こちらの記事で解説していますので、良かったらこちらもどうぞ。

次回はとうとうos.モジュールとshutilモジュールのまとめと比較をしていきたいと思います。
ということで今回はこんな感じで。
コメント