ファイルまたはフォルダを削除するにはどうすればよいですか?


回答:


3346
  • os.remove() ファイルを削除します。

  • os.rmdir() 空のディレクトリを削除します。

  • shutil.rmtree() ディレクトリとそのすべての内容を削除します。


PathPython 3.4+ pathlibモジュールのオブジェクトも、これらのインスタンスメソッドを公開します。


5
Windowsのos.rmdir()は、ターゲットディレクトリが空でなくてもディレクトリシンボリックリンクも削除します
Lu55

8
ファイルが存在しない場合はos.remove()例外をスローするためos.path.isfile()、最初にチェックするか、でラップする必要がある場合がありtryます。
Ben Crowell 2018

2
Path.unlink 1 /が再帰的だった2 / FileNotfoundErrorを無視するオプションを追加したい。
ジェローム2018

7
完了のためだけです... os.remove()ファイルが存在しない場合にスローされる例外はFileNotFoundErrorです。
PedroA

os.remove() 複数のファイルを削除するために複数の引数を取りますか、それともファイルごとに毎回呼び出しますか?
user742864

292

ファイルを削除するPython構文

import os
os.remove("/tmp/<file_name>.txt")

または

import os
os.unlink("/tmp/<file_name>.txt")

または

Pythonバージョン> 3.5のpathlibライブラリ

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink(missing_ok = False)

ファイルまたはシンボリックリンクを削除するために使用されるリンク解除メソッド。

missing_okがfalse(デフォルト)の場合、パスが存在しないとFileNotFoundErrorが発生します。
missing_okがtrueの場合、FileNotFoundError例外は無視されます(POSIX rm -fコマンドと同じ動作)。
バージョン3.8で変更:missing_okパラメータが追加されました。

ベストプラクティス

  1. まず、ファイルまたはフォルダが存在するかどうかを確認してから、そのファイルのみを削除します。これは、次の2つの方法で実現できます
    os.path.isfile("/path/to/file")
    b。使用するexception handling.

についてos.path.isfile

#!/usr/bin/python
import os
myfile="/tmp/foo.txt"

## If file exists, delete it ##
if os.path.isfile(myfile):
    os.remove(myfile)
else:    ## Show an error ##
    print("Error: %s file not found" % myfile)

例外処理

#!/usr/bin/python
import os

## Get input ##
myfile= raw_input("Enter file name to delete: ")

## Try to delete the file ##
try:
    os.remove(myfile)
except OSError as e:  ## if failed, report it back to the user ##
    print ("Error: %s - %s." % (e.filename, e.strerror))

それぞれの出力

削除するファイル名を入力してください:demo.txt
エラー:demo.txt-そのようなファイルまたはディレクトリはありません。

削除するファイル名を入力してください:rrr.txt
エラー:rrr.txt-操作は許可されていません。

削除するファイル名を入力してください:foo.txt

フォルダーを削除するPython構文

shutil.rmtree()

の例 shutil.rmtree()

#!/usr/bin/python
import os
import sys
import shutil

# Get directory name
mydir= raw_input("Enter directory name: ")

## Try to remove tree; if failed show an error using try...except on screen
try:
    shutil.rmtree(mydir)
except OSError as e:
    print ("Error: %s - %s." % (e.filename, e.strerror))

13
2つの行の間でファイルが削除または変更される可能性があるため、チェックよりも例外処理をお勧めします(TOCTOU:en.wikipedia.org/wiki/Time_of_check_to_time_of_use。PythonFAQ docs.python.org/3/glossary.html#term-eafp
エリックアラウホ

84

使用する

shutil.rmtree(path[, ignore_errors[, onerror]])

shutilに関する完全なドキュメントを参照)および/または

os.remove

そして

os.rmdir

osの完全なドキュメント。)


6
pathlibインターフェース(Python 3.4以降の新機能)をリストに追加してください。
Paebbels

38

os.removeとを使用する堅牢な関数を次に示しますshutil.rmtree

def remove(path):
    """ param <path> could either be relative or absolute. """
    if os.path.isfile(path) or os.path.islink(path):
        os.remove(path)  # remove the file
    elif os.path.isdir(path):
        shutil.rmtree(path)  # remove dir and all contains
    else:
        raise ValueError("file {} is not a file or dir.".format(path))

8
つまり、ISO C remove(path);呼び出しをシミュレートする8行のコードです。
Kaz

2
@Kazは迷惑なことに同意しましたが、削除は木の扱いですか?:-)
Ciro Santilli冠状病毒审查六四事件法轮功

6
os.path.islink(file_path): バグである必要がありますos.path.islink(path):
Neo li

32

組み込みpathlibモジュールを使用できます(Python 3.4以降が必要ですが、PyPIの古いバージョンにはバックポートがあります:pathlibpathlib2)。

ファイルを削除するには、次のunlink方法があります。

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

または、空のフォルダrmdirを削除する方法:

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

2
空でないディレクトリはどうですか?
Pranasas

@Pranasas残念ながら、pathlib空ではないディレクトリの削除を処理できるものは(本来的に)何もないようです。ただし、使用できますshutil.rmtree。他のいくつかの回答で言及されているので、ここには含めません。
MSeifert 2018

30

Pythonでファイルまたはフォルダーを削除するにはどうすればよいですか?

Python 3の場合、ファイルとディレクトリを個別に削除するには、それぞれunlinkおよびメソッドを使用します。rmdir Path

from pathlib import Path
dir_path = Path.home() / 'directory' 
file_path = dir_path / 'file'

file_path.unlink() # remove file

dir_path.rmdir()   # remove directory

Pathオブジェクトで相対パスを使用することもでき、現在の作業ディレクトリをで確認できることに注意してくださいPath.cwd

Python 2で個々のファイルとディレクトリを削除する方法については、以下のラベルの付いたセクションをご覧ください。

内容を含むディレクトリを削除するには、を使用しますshutil.rmtree。これはPython 2および3で使用できることに注意してください。

from shutil import rmtree

rmtree(dir_path)

デモンストレーション

Python 3.4の新機能はPathオブジェクトです。

1つを使用して、使用方法を示すディレクトリとファイルを作成しましょう。/パスの一部を結合するためにを使用していることに注意してください。これは、オペレーティングシステム間の問題と、Windowsでのバックスラッシュの使用による問題を回避します(バックスラッシュを2倍にするか\\、などの生の文字列を使用する必要がありますr"foo\bar")。

from pathlib import Path

# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()

file_path = directory_path / 'file'
file_path.touch()

そしていま:

>>> file_path.is_file()
True

では、削除してみましょう。まずファイル:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

グロビングを使用して複数のファイルを削除することができます-最初にこれのためにいくつかのファイルを作成しましょう:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

次に、globパターンを反復処理します。

>>> for each_file_path in directory_path.glob('*.my'):
...     print(f'removing {each_file_path}')
...     each_file_path.unlink()
... 
removing ~/directory/foo.my
removing ~/directory/bar.my

次に、ディレクトリの削除を示します。

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

ディレクトリとその中のすべてを削除したい場合はどうなりますか?このユースケースでは、shutil.rmtree

ディレクトリとファイルを再作成しましょう:

file_path.parent.mkdir()
file_path.touch()

rmdir空でない限り失敗することに注意してください。これがrmtreeがとても便利な理由です。

>>> directory_path.rmdir()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
    self._accessor.rmdir(self)
  File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'

次に、rmtreeをインポートし、ディレクトリを関数に渡します。

from shutil import rmtree
rmtree(directory_path)      # remove everything 

すべてが削除されていることがわかります。

>>> directory_path.exists()
False

Python 2

Python 2を使用している場合、pathlib2と呼ばれるpathlibモジュールのバックポートがあり、 pipでインストールできます。

$ pip install pathlib2

そして、あなたはライブラリに別名を付けることができます pathlib

import pathlib2 as pathlib

または、単にPathオブジェクトを直接インポートします(ここで説明します)。

from pathlib2 import Path

それが多すぎる場合は、またはでファイルを削除できますos.removeos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

または

unlink(join(expanduser('~'), 'directory/file'))

そしてあなたはディレクトリを削除することができますos.rmdir

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

aもあることに注意してください。os.removedirsこれは空のディレクトリを再帰的に削除するだけですが、ユースケースに合う場合があります。


rmtree(directory_path)Python 3.6.6では機能しますが、Python 3.5.2では機能しません-必要rmtree(str(directory_path)))です。
スタイン

4
import os

folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)

for f in fileList:
    filePath = folder + '/'+f

    if os.path.isfile(filePath):
        os.remove(filePath)

    elif os.path.isdir(filePath):
        newFileList = os.listdir(filePath)
        for f1 in newFileList:
            insideFilePath = filePath + '/' + f1

            if os.path.isfile(insideFilePath):
                os.remove(insideFilePath)

1
これは、完全なフォルダ構造を残すのみフォルダ内のファイルとサブフォルダを削除します。..
Lalithesh

4

shutil.rmtreeは非同期関数であるため、完了時に確認する場合は、while ... loopを使用できます。

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1
shutil.rmtree非同期ではありません。ただし、ウイルススキャナーが干渉しているWindows上にあるようです。
mhsmith

@mhsmith ウイルススキャナー?それは野生の憶測ですか、それとも実際にこの影響を引き起こす可能性があることを知っていますか?もしそうなら、それは一体どのように機能しますか?
マークアメリー

2

ファイルを削除する場合:

os.unlink(path, *, dir_fd=None)

または

os.remove(path, *, dir_fd=None)

両方の機能は意味的に同じです。この関数は、ファイルパスを削除(削除)します。パスがファイルではなくディレクトリの場合、例外が発生します。

フォルダを削除する場合:

shutil.rmtree(path, ignore_errors=False, onerror=None)

または

os.rmdir(path, *, dir_fd=None)

ディレクトリツリー全体を削除するにshutil.rmtree()は、を使用できます。os.rmdirディレクトリが空で存在する場合にのみ機能します。

親に向かってフォルダを再帰的に削除する場合:

os.removedirs(name)

それはいくつかのコンテンツを持つ親までの自己を持つすべての空の親ディレクトリを削除

例:os.removedirs( 'abc / xyz / pqr')は、ディレクトリが空の場合、「abc / xyz / pqr」、「abc / xyz」、「abc」の順にディレクトリを削除します。

詳細は、公式ドキュメントをチェックするために:os.unlinkos.removeos.rmdirshutil.rmtreeos.removedirs


1

フォルダ内のすべてのファイルを削除するには

import os
import glob

files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
    os.remove(file)

ディレクトリ内のすべてのフォルダを削除するには

from shutil import rmtree
import os

// os.path.join()  # current working directory.

for dirct in os.listdir(os.path.join('path/to/folder')):
    rmtree(os.path.join('path/to/folder',dirct))

0

ÉricAraujo のコメントで強調されているTOCTOUの問題を回避するには、例外をキャッチして正しいメソッドを呼び出します。

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

以来shutil.rmtree()ディレクトリのみを削除し、os.remove()またはos.unlink()ファイルのみを削除します。


shutil.rmtree()ディレクトリだけでなくその内容も削除します。
Tiago Martins Peres李大仁

-1

subprocess美しく読みやすいコードを書くのがあなたのお茶である場合は、以下を使用することをお勧めします。

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

また、ソフトウェアエンジニアでない場合は、Jupyterの使用を検討してください。あなたは単にbashコマンドを入力することができます:

!rm -r my_dir

伝統的に、あなたは使用しますshutil

import shutil
shutil.rmtree(my_dir) 

3
サブプロセスは避けるべき実践です
dlewin

3
これはお勧めsubprocessしません。shutil.rmtreeないrm -r仕事だけで罰金は、Windows上で作業の追加ボーナスで、さん。
マークアメリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.