Pythonでファイル、ディレクトリを削除する方法: os.remove, shutil.rmtree, os.rmdir, os.removedirs
- 作成日: 2021-05-28
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonでファイル、ディレクトリを削除する方法
Pythonはライブラリを使うとファイルを削除することができます。
ファイルを削除するにはos.remove(), 中身のあるディレクトリの削除にはshutil.rmtree(), 空のディレクトリの削除にはos.rmdir(), os.removedirs()が使えます。
この記事ではこれらのライブラリを使ってファイル、ディレクトリを削除する方法を解説します。
結論から言うとファイル単体の削除は↓のようにします。
import os
os.remove('samples/file.txt')
中身のあるディレクトリの再帰的な削除は↓のようにします。
import shutil
shutil.rmtree('samples/')
具体的に↓を見ていきます。
- 削除対象とするディレクトリ構造
- os.remove()でファイルを削除
- shutil.rmtree()でディレクトリごと削除
- os.rmdir()で空ディレクトリを削除
- os.removedirs()で空ディレクトリを再帰的に削除
削除対象とするディレクトリ構造
この記事の解説で削除対象とするディレクトリ構造は↓のようなものです。
samples/
├── dir1
│ ├── aaa.txt
│ └── bbb.txt
├── dir2
│ └── emptydir
├── emptydir
└── file.txt
4 directories, 3 files
samples/
以下にはdir1/
, dir2/
, emptydir/
の3つのディレクトリがあります。
そしてfile.txt
が存在します。
dir1/
にはaaa.txt
とbbb.txt
の2つのファイルが存在します。
dir2/
には空ディレクトリのemptydir/
が存在します。
os.remove()でファイルを削除
ファイルの削除にはos.remove()
を使います。
os.remove()
は↓のような構造になっています。
os.remove(path, *, dir_fd=None)
os.remove()
の第1引数のpath
にファイルのパスを指定します。
パスは文字列かバイト列、あるいはpathlib.Path
オブジェクトを渡すことができます。
os.remove()
はそのパスのファイルを削除します。
os.remove()
は↓のようにos
モジュールをインポートして使います。
import os
os.remove('samples/file.txt')
↑のコードを実行すると、samples/file.txt
が削除されます。
os.remove()
の第1引数path
に不正なパスを渡した場合は例外が送出されます。
import os
try:
os.remove('nothing/path')
except FileNotFoundError as e:
print(e)
# [Errno 2] No such file or directory: 'nothing/path'
try:
os.remove(None)
except TypeError as e:
print(e)
# remove: path should be string, bytes or os.PathLike, not NoneType
↑のようにパスが存在しない場合はFileNotFoundError
が送出されます。
それからパスが不正なタイプだった場合はTypeError
が送出されます。
pathlib.Path
オブジェクトを渡す場合は↓のようになります。
import os
from pathlib import Path
path = Path('samples/file.txt')
os.remove(path)
shutil.rmtree()でディレクトリごと削除
shutil.rmtree()
は中身のあるディレクトリを丸ごと削除します。
ピンと来た方はけっこういるかもしれませんが、使い方を間違えるとけっこう危険な関数です。
shutil.rmtree()
は↓のような構造になっています。
shutil.rmtree(path, ignore_errors=False, onerror=None)
第1引数にはパスを指定します。これは文字列かバイト列、あるいはPath
オブジェクトです。
ignore_errors
がTrue
のとき、削除に失敗した場合のエラーは無視されます。
ignore_errors
がFalse
のとき、onerror
に指定された関数が参照されます。
onerror
がNone
の場合は例外を送出します。
onerror
の詳細については↓をご覧ください。
shutil.rmtree()
は↓のように使います。
import shutil
shutil.rmtree('samples/')
↑のコードを実行するとsamples/
以下のすべてのディレクトリ、ファイルがごっそり削除されます。
🦝 < デンジャー
この関数を使った開発を行う場合は、仮想環境を用意するなどの工夫をして事故防止をしたほうがいいでしょう。
os.rmdir()で空ディレクトリを削除
単体の空ディレクトリを削除するにはos.rmdir()
を使います。
os.rmdir()
は↓のような構造になっています。
os.rmdir(path, *, dir_fd=None)
第1引数のpath
には文字列かバイト列、Path
オブジェクトを指定します。
os.rmdir()
はpath
が空ディレクトリの場合であればそのpath
を削除します。
import os
os.rmdir('samples/emptydir')
os.rmdir()
は第1引数のpath
が存在しない場合、FileNotFoundError
を送出します。
また、path
が文字列、バイト列、Path
オブジェクト以外のオブジェクトであればTypeError
を送出します。
また、ディレクトリの中身が空でない場合はOSError
を送出します。
import os
try:
os.rmdir('nothing/path')
except FileNotFoundError as e:
print(e)
# [Errno 2] No such file or directory: 'nothing/path'
try:
os.rmdir(None)
except TypeError as e:
print(e)
# rmdir: path should be string, bytes or os.PathLike, not NoneType
try:
os.rmdir('samples/')
except OSError as e:
print(e)
# [Errno 39] Directory not empty: 'samples/'
os.removedirs()で空ディレクトリを再帰的に削除
空ディレクトリを再帰的に削除したい場合はos.removedirs()
を使います。
os.removedirs()
は↓のような構造になっています。
os.removedirs(name)
os.removedirs()
はname
に指定されたパスを再帰的に削除します。
末端のディレクトリが空であればそのディレクトリを削除し、親のディレクトリを削除するか判断します。
その段階で親のディレクトリが空であれば、os.removedirs()
はそのディレクトリを削除していきます。
たとえばsamples/dir2/emptrydir
を指定した場合は、最初にemptydir/
を削除し、その次にdir2/
を削除し、最終的にsamples/
を削除できるかどうか検討します。
samples/
は空でないのでこの場合、samples
は削除されません。
import os
os.removedirs('samples/dir2/emptydir')
os.removedirs()
は末端のディレクトリが削除できなかった場合はOSError
を送出します。
import os
try:
os.removedirs('samples/')
except OSError as e:
print(e)
# [Errno 39] Directory not empty: 'samples/'
おわりに
今回はPythonによるファイル削除の方法を見てみました。
ファイル削除は慎重にやるか、開発用の環境を別に用意しておくといいかもしれません。
🦝 < 事故防止!
🐭 < まれによくある事故