ファイル・フォルダ操作 文法・環境 標準ライブラリ・モジュール

【python】ファイル・フォルダの削除【os、shutil、pathlib】

pythonで、ファイル・フォルダを削除する方法について紹介します。

本記事では、下記の内容を紹介しています。

この記事で分かること

■ファイルを削除【os、pathlib】

  • 1つのファイルを削除【os.remove】
  • ファイルが存在する場合、ファイルを削除
  • 複数のファイルをまとめて削除【globとの組合せ】
  • サブフォルダを含めて、複数のファイルを削除【globとの組合せ】
  • pathlibモジュールを用いて、ファイルを削除

■フォルダを削除【os、shutil、pathlib】

  • 空のフォルダを削除【os.rmdir】
  • フォルダが空の場合に、末端のフォルダから再帰的に削除【os.removedirs】
  • フォルダを中身ごとすべて削除【shutil.rmtree】
  • pathlibモジュールを用いて、フォルダを削除

スポンサーリンク

ファイルを削除【os、pathlib】

はじめに、ファイルを削除する方法について紹介します。

pythonの標準モジュールである、osモジュール、pathlibモジュールを用いたファイルの削除方法について、順番に紹介します。

1つのファイルを削除 【os.remove】

osモジュールの、os.removeを用いることで、1つのファイルを削除することができます

以下、os.removeを用いて、ファイルを削除するサンプルコードです。
os.removeの引数には、ファイルのパスを指定します。

### os.removeで、1つのファイルを削除
import os

print(os.path.exists(r'test\new_file.txt'))
# True

os.remove(r'test\new_file.txt')

print(os.path.exists(r'test\new_file.txt'))
# False

> print(os.path.exists(r'test\new_file.txt'))

os.path.exists( パス ) でファイルの存在確認をしています。
Trueと返ってきているので、この時点ではファイルが存在することが分かります。

> os.remove(r'test\new_file.txt')

ファイルのパスを引数に渡し、ファイルを削除しています。

再度、存在確認をし、「False」が返ってきているため、ファイルが削除されていることが分かります。

なお、指定したファイルが存在しない場合は、
「FileNotFoundError : 指定されたファイルが見つかりません」というエラーが発生します。

存在しないファイルのパスを誤って指定した場合にエラー停止することを避けるために、
ファイルが存在する場合のみ、ファイル削除を行う方法を次に紹介します。

ファイルがあれば(存在すれば)、ファイルを削除

ファイルが存在する場合のみ、ファイル削除操作を行う場合は、「if文」や「try文」と組合せます

はじめに、if文の条件分岐を用いる方法を紹介します。

以下、サンプルコードです。

### ファイルが存在すれば削除
import os

print(os.path.exists(r'test\new_file.txt'))
# True

if os.path.exists(r'test\new_file.txt') :
    os.remove(r'test\new_file.txt')

print(os.path.exists(r'test\new_file.txt'))
# False

> if os.path.exists(r'test\new_file.txt') :

ファイルが存在する場合にTrueとなる、os.path.exists( ) と、if文を組み合わせています。

ファイルの存在確認については、下記の記事で紹介しています。

ファイル・フォルダの存在確認

次に、try文の例外処理で、ファイルが存在しない場合のエラー発生を回避する方法を紹介します。

以下、try文を用いたサンプルコードです。
except節に、ファイルが存在しない場合に発生するエラー「FileNotFoundError」を指定しています。

### try文の例外処理を用いて、ファイルが存在する場合にファイルを削除
import os


try :
    os.remove(r'test\new_file.txt')
except FileNotFoundError as e:
    print('ファイルが存在しません')
    print(type(e))
    print(e)

例外処理と組み合わせることで、ファイルが存在する場合のみ、ファイルを削除することができます。

指定したパスのファイルが存在しない場合は、以下のメッセージが出力されます。
>ファイルが存在しません
><class 'FileNotFoundError'>
>[WinError 2] 指定されたファイルが見つかりません。: 'test\new_file.txt'

例外処理については、下記の記事で紹介しています。

例外処理の基本【try、except等】

スポンサーリンク

複数のファイルをすべて削除【globとの組合せ】

ここまで、1つのファイルを削除する方法を紹介してました。

次に、複数のファイルをいっきに削除する方法を紹介します。

以下、複数のファイルをいっきに削除するサンプルコードです。
globモジュールを用いて、削除したいファイルパスをリストで取得し、for文でos.removeを用いて削除しています。

### 複数のファイルを削除
import os
import glob
import pprint

pprint.pprint(glob.glob(r'test\new_dir1\*.txt'))
"""
['test\\new_dir1\\1.txt',
 'test\\new_dir1\\2.txt',
 'test\\new_dir1\\3.txt',
 'test\\new_dir1\\4.txt',
 'test\\new_dir1\\5.txt']
"""

for file in glob.glob(r'test\new_dir1\*.txt'):
    os.remove(file)
    
pprint.pprint(glob.glob(r'test\new_dir1\*.txt'))
"""
[]
 """

> glob.glob(r'test\new_dir1\*.txt')

globモジュールを用いて、ファイルパスのリストを取得しています。
glob.globの引数には、抽出したいパスに対応する検索パターンを指定しています。
ここでは、例として、ワイルドカード「*」を用いて、拡張子が「.txt」のファイルを抽出しています。

globモジュールを用いて、複数のファイルパスを取得する方法については、下記の記事で紹介しています。

ファイル・フォルダの一覧取得

サブフォルダを含めて、複数のファイルをすべて削除【globとの組合せ】

さきほどの例では、同じフォルダ内に入っている複数のファイルのみが削除対象でした。

指定したフォルダより深い、サブフォルダも含めて、複数のファイルをすべて削除する方法を紹介します。

以下、サンプルコードです。
globモジュールを用いて、対象のファイルパスを、深い階層のフォルダまで再帰的に探しています。

### サブディレクトリを含めて、複数のファイルを削除
import os
import glob
import pprint

pprint.pprint(glob.glob(r'test\new_dir1\**\*.txt', recursive=True))
"""
['test\\new_dir1\\1.txt',
 'test\\new_dir1\\2.txt',
 'test\\new_dir1\\3.txt',
 'test\\new_dir1\\new_dir2\\1.txt',
 'test\\new_dir1\\new_dir2\\2.txt',
 'test\\new_dir1\\new_dir2\\3.txt']
"""

for file in glob.glob(r'test\new_dir1\**\*.txt', recursive=True):
    os.remove(file)
    
pprint.pprint(glob.glob(r'test\new_dir1\**\*.txt', recursive=True))
"""
[]
"""

> glob.glob(r'test\new_dir1\**\*.txt', recursive=True)

「new_dir1」より深い階層のフォルダについて、「*.txt」のパターンのファイルのパスを再帰的に取得しています。

pathlibモジュールを用いて、ファイルを削除

次に、pathlibモジュールを用いて、ファイルを削除する方法を紹介します。

pathlibモジュールを用いると、ファイル・ディレクトリのパスを、オブジェクトとして操作できます。

以下、pathlibモジュールでファイルを削除するサンプルコードです。

### pathlibモジュールでファイルを削除
# pathlibモジュールでファイルを削除
import pathlib

p_file = pathlib.Path(r'test\new_file.txt')

print(p_file.exists())
# True

try:
    p_file.unlink()
except OSError as e:
    print(f"Error:{ e.strerror}")

print(p_file.exists())
# False

> p_file = pathlib.Path(r'test\new_file.txt')

パスのオブジェクトを生成しています。

> p_file.unlink( )

パスオブジェクトのunlinkメソッドで、ファイルを削除できます。

pathlibモジュールの使い方については、下記の記事で紹介しています。

pathlibモジュールの基本的な使い方

スポンサーリンク

フォルダを削除【os、shutil、pathlib】

ここからは、フォルダを削除する方法について紹介します。

pythonの標準モジュールである、osモジュール、shutilモジュール、pathlibモジュールを用いたフォルダの削除方法について、順番に紹介します。

空のフォルダを削除【os.rmdir】

osモジュールの、os.rmdirを用いて、フォルダを削除する方法を紹介します。

os.rmdirを用いると、指定したパスのフォルダを削除することができます。
なお、削除するフォルダは、中身が空である必要があります。

以下、os.rmdirを用いて、フォルダを削除するサンプルコードです。

### 空のフォルダを削除【os.rmdir】
import os

print(os.listdir(r'test'))
# ['file1.txt', 'file2.txt', 'folder1', 'new_dir1', 'pic1.jpg', 'pic2.jpg']

os.rmdir(r'test\new_dir1')

print(os.listdir(r'test'))
# ['file1.txt', 'file2.txt', 'folder1', 'pic1.jpg', 'pic2.jpg']

> os.rmdir(r'test\new_dir1')

フォルダのパスを指定し、削除しています。

なお、フォルダが空でない場合は、「OSError : ディレクトリが空ではありません」というエラーとなります。

フォルダが空の場合に、末端のフォルダから再帰的に削除【os.removedirs】

さきほどの例では、パスを指定した1つのフォルダしか削除できません。

ここでは、複数のフォルダをいっきに削除する方法を紹介します。

osモジュールの、os.removedirsを用いることで、末端のフォルダから、再帰的にフォルダを削除することができます

なお、フォルダの中身が空でない場合は、フォルダは削除されません。

以下、os.removedirsを用いてフォルダを削除するサンプルコードです。

### 末端のフォルダから再帰的に削除【os.removedirs】
import glob
import pprint

pprint.pprint(glob.glob(r'test\**\*', recursive=True))
"""
['test\\file1.txt',
 'test\\file2.txt',
 'test\\pic1.jpg',
 'test\\pic2.jpg',
 'test\\new_dir1\\1.txt',
 'test\\new_dir1\\2.txt',
 'test\\new_dir1\\3.txt',
 'test\\new_dir1\\new_dir2',
 'test\\new_dir1\\new_dir2\\new_dir3',
 'test\\new_dir1\\new_dir2\\new_dir3\\new_dir4']
"""

os.removedirs(r'test\\new_dir1\\new_dir2\\new_dir3\\new_dir4')

pprint.pprint(glob.glob(r'test\**\*', recursive=True))
"""
['test\\file1.txt',
 'test\\file2.txt',
 'test\\pic1.jpg',
 'test\\pic2.jpg',
 'test\\new_dir1\\1.txt',
 'test\\new_dir1\\2.txt',
 'test\\new_dir1\\3.txt']
"""

> os.removedirs(r'test\new_dir1\new_dir2\new_dir3\new_dir4')

末端のフォルダを指定しています。

pprintの出力結果を見ると、中身の入っていないフォルダが削除されていることが分かります。

フォルダを中身ごとすべて削除【shutil.rmtree】

空でないフォルダを削除したい場合は、shutilモジュールの、shutil.rmtreeを使用します。

shutil.rmtreeの引数に、削除したいフォルダをパスを渡すことで、フォルダを中身ごと削除できます。

以下、shutil.rmtreeを用いて、中身ごとフォルダを削除するサンプルコードです。

### フォルダを中身ごと削除【shutil.rmtree】
import shutil
import glob
import pprint

pprint.pprint(glob.glob(r'test\**\*', recursive=True))
"""
['test\\file1.txt',
 'test\\file2.txt',
 'test\\new_dir1',
 'test\\pic1.jpg',
 'test\\pic2.jpg',
 'test\\new_dir1\\1.txt',
 'test\\new_dir1\\2.txt',
 'test\\new_dir1\\3.txt',
 'test\\new_dir1\\new_dir2',
 'test\\new_dir1\\new_dir2\\1.txt',
 'test\\new_dir1\\new_dir2\\2.txt',
 'test\\new_dir1\\new_dir2\\3.txt']
"""

shutil.rmtree(r'test\new_dir1')

pprint.pprint(glob.glob(r'test\**\*', recursive=True))
"""
['test\\file1.txt',
 'test\\file2.txt',
 'test\\pic1.jpg',
 'test\\pic2.jpg',]
"""

> shutil.rmtree(r'test\new_dir1')

shutil.rmtreeの引数に、削除したいフォルダのパスを渡しています。

pathlibモジュールを用いて、フォルダを削除

次に、puthlibモジュールを用いて、フォルダを削除する方法を紹介します。

ファイルの削除でも簡単に紹介していますが、pathlibモジュールを用いることで、ファイル・ディレクトリのパスをオブジェクトとして操作できます。

pathlibモジュールを用いてフォルダを削除するには、パスオブジェクトのrmdirメソッドを使用します。

以下、pathlibモジュールでフォルダを削除するサンプルコードです。

### pathlibモジュールを用いて、フォルダを削除
import pathlib

p_dir = pathlib.Path(r'test\new_dir1')

print(p_dir.exists())
# True

p_dir.rmdir()

print(p_dir.exists())
# False

パスオブジェクトのrmdirメソッドを用いる方法では、フォルダの中身が空の場合にしかフォルダを削除できません。

中身のあるフォルダを削除する場合は、前述のshutil.rmtreeを使用することになります。

スポンサーリンク

-ファイル・フォルダ操作, 文法・環境, 標準ライブラリ・モジュール
-, ,