前回のおさらい
過去5回に渡って、osモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。
前回はshutilモジュールのうち、ファイルをコピーするshutil.copyfileとフォルダをコピーする shutil.copytreeを解説しました。
今回はファイルを移動する方法と名前を変更する方法を解説していきます。
前回、色々とコピーしたのでフォルダ構造が結構複雑になっています。
ちょっと複雑すぎるので、folder3とfolder4を削除して、分かりやすくしておきましょう。
Pythonプログラムはos_module_test内に新しいものを作成し、shutilモジュールをインポートしておきます。
import shutil
ではでは始めていきましょう。
ファイル、フォルダの移動:shutil.move(“移動前”,”移動後”)
ファイルの移動
shutilモジュールを使って、ファイルやフォルダを移動するにはshutil.move(“移動前”,”移動後”)を使います。
まずはdocument3.txtをfolder2に移動してみましょう。
shutil.move("document3.txt", "./folder2")
特に問題なく、ファイルを移動させることができました。
フォルダの移動
次に同じコマンドでフォルダも移動できるか試してみましょう。
folder2をfolder1に移動させてみます。
これによりフォルダの中にファイルがあっても移動できるかもついでに確認してみましょう。
shutil.move("folder2", "./folder1")
folder1の中にfolder2を移動することができました。
ということはフォルダ内にファイルがあっても、shutil.moveでは問題なく移動できるということになります。
ファイル名・フォルダ名の変更
前にosモジュールのos.renameを紹介した際、os.renameではファイルやフォルダ名の変更ができる上、ファイルやフォルダの移動もできました。
実はshutil.moveはファイル・フォルダの移動だけではなく、逆にファイル・フォルダの名前の変更をすることができます。
まずはdocument1.txtをdocument5.txtに変更してみましょう。
shutil.move("document1.txt","document5.txt")
変更することができました。
次にフォルダ名も変更できるか試してみましょう。
フォルダに何かファイルが入っていてもフォルダ名を変更できるか試すため、folder2をfolder3に変更してみます。
shutil.move("folder2","folder3")
こちらも問題なく変更することができ、フォルダに何か入っていたとしてもshutil.moveでフォルダ名を変更できることが分かりました。
今回はshutil.moveを使ってファイル・フォルダの移動とファイル名・フォルダ名の変更をしてみました。
ほぼ同じことがosモジュールのos.renameでも可能です。
しかしos.renameではフォルダ内に何か入っている時、そのフォルダの名前は変更できますが、移動はできません。
それに対しshutil.moveではフォルダ内に何か入っているいないにかかわらず、そのフォルダの移動や名前の変更をすることができます。
同じ様なことができるにしてもちょっとずつできることが違ういい例だと思います。
フォルダの削除: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モジュールのまとめと比較をしていきたいと思います。
ということで今回はこんな感じで。
コメント