Pythonでファイル、ディレクトリを削除する方法: os.remove, shutil.rmtree, os.rmdir, os.removedirs

259, 2021-05-28

目次

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.txtbbb.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_errorsTrueのとき、削除に失敗した場合のエラーは無視されます。
ignore_errorsFalseのとき、onerrorに指定された関数が参照されます。
onerrorNoneの場合は例外を送出します。

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によるファイル削除の方法を見てみました。
ファイル削除は慎重にやるか、開発用の環境を別に用意しておくといいかもしれません。

事故防止!

まれによくある事故

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。