回答:
import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
print('Failed to delete %s. Reason: %s' % (file_path, e))
except Exception as e:
それを読んでパイリント警告を受けていますW0703: Catching too general exception Exception
。キャッチするより具体的な例外はありますか、それとも無視すべきですか?
あなたは単にこれを行うことができます:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
もちろん、パス内の他のフィルターを使用することもできます。たとえば、/ YOU / PATH / *。txtを使用して、ディレクトリ内のすべてのテキストファイルを削除します。
*
は隠しファイルを一覧表示しないため、追加する必要がありますglob.glob('path/.*)
import sh; sh.rm(files)
import sh; sh.rm(files)
ルックきれいのないディレクトリ内の1024個の以上のファイルがある場合、あなたはトラブルに実行します。
以下を使用して、フォルダ自体とそのすべての内容を削除できますshutil.rmtree
。
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
ディレクトリツリー全体を削除します。pathはディレクトリを指す必要があります(ただし、ディレクトリへのシンボリックリンクは指しません)。場合IGNORE_ERRORSが真である、削除に失敗したことによるエラーは無視されます。falseまたは省略されている場合、そのようなエラーはonerrorで指定されたハンドラーを呼び出すことによって処理されます。省略されている場合は、例外が発生します。
rmtree
。のようなものos.makedirs(dir)
OSError: [Errno 16] Device or resource busy
mhawkeの答えを拡張すると、これが私が実装したものです。フォルダーのコンテンツはすべて削除されますが、フォルダー自体は削除されません。ファイル、フォルダ、シンボリックリンクを使用してLinuxでテストすると、Windowsでも動作するはずです。
import os
import shutil
for root, dirs, files in os.walk('/path/to/folder'):
for f in files:
os.unlink(os.path.join(root, f))
for d in dirs:
shutil.rmtree(os.path.join(root, d))
walk
dirsとファイルを分割するために使用されます。ファイルは異なる方法で処理する必要があります。を使用することもできますがos.listdir
、各エントリがディレクトリまたはファイルであるかどうかを手動で確認する必要があります。
os.walk
ここでは再帰しないことに注意してください。ジェネレータを返すのは、サブディレクトリを進めようとしたときに再帰的に調べられるだけであり、このループの最初の反復が完了するまでに、サブディレクトリはないためです。見て左。本質的にos.walk
は、ここでは、最上位のフォルダーと最上位のファイルを区別する別の方法として使用されています。再帰は使用されておらず、そのためのパフォーマンスコストは発生しません。しかし、それは偏心的であり、あなたが提案するアプローチは、それがより明確で読みやすいので、単に優れていることに同意します。
rmtree
フォルダを使用して再作成することは可能ですが、ネットワークドライブ上のフォルダを削除してすぐに再作成するときにエラーが発生しました。
ウォークを使用して提案されたソリューションはrmtree
、フォルダーの削除に使用されるため機能せずos.unlink
、以前はそれらのフォルダーにあったファイルを使用しようとする場合があります。これによりエラーが発生します。
投稿されたglob
ソリューションは、空ではないフォルダも削除しようとするため、エラーが発生します。
私はあなたが使うことを勧めます:
folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
file_object_path = os.path.join(folder_path, file_object)
if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
os.unlink(file_object_path)
else:
shutil.rmtree(file_object_path)
os.path.isfile()
はFalse
(シンボリックリンクをたどっているため)が返さshutil.rmtree()
れ、最終的にはを発生させるシンボリックリンクが呼び出されますOSError("Cannot call rmtree on a symbolic link")
。
islink
、ディレクトリへのシンボリックリンクを正しく処理するために、ここでのチェックの必要性を指摘するのに適切です。承認された回答にそのようなチェックを追加しました。
この:
コード:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
他の多くの回答と同様に、これはファイル/ディレクトリの削除を可能にするために権限を調整しようとするものではありません。
ワンライナーとして:
import os
# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )
ファイルとディレクトリも考慮したより堅牢なソリューションは(2.7)です。
def rm(f):
if os.path.isdir(f): return os.rmdir(f)
if os.path.isfile(f): return os.unlink(f)
raise TypeError, 'must be either file or directory'
map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )
list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir))))
map
インlist
する必要があります。参照http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-xを
注:誰かが私の回答に反対票を投じた場合、私はここで説明することができます。
shutil.rmtree()
ディレクトリツリーの削除に使用できることは知っています。私は自分のプロジェクトで何度も使用しました。ただし、ディレクトリ自体もによって削除されるshutil.rmtree()
ことを理解する必要があります。これは一部には受け入れられるかもしれませんが、(副作用なしで)フォルダの内容を削除する有効な回答ではありません。shutil.rmtree()
で再構築しos.mkdir()
ます。そして、代わりにデフォルトの(継承された)所有者とモードビットを持つ空のディレクトリを取得します。コンテンツやディレクトリを削除する権限がある場合でも、ディレクトリの元の所有者とモードビットを元に戻すことができない場合があります(たとえば、スーパーユーザーではない場合)。これは長くて醜いですが、信頼性が高く効率的なソリューションです。
他の回答者が対処していないいくつかの問題を解決します。
shutil.rmtree()
(os.path.isdir()
ディレクトリにリンクしている場合はテストに合格します。結果にos.walk()
シンボリックリンクディレクトリも含まれます)。これがコードです(唯一の便利な関数はですclear_dir()
):
import os
import stat
import shutil
# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
# Handle read-only files and directories
if fn is os.rmdir:
os.chmod(path_, stat.S_IWRITE)
os.rmdir(path_)
elif fn is os.remove:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
def force_remove_file_or_symlink(path_):
try:
os.remove(path_)
except OSError:
os.lchmod(path_, stat.S_IWRITE)
os.remove(path_)
# Code from shutil.rmtree()
def is_regular_dir(path_):
try:
mode = os.lstat(path_).st_mode
except os.error:
mode = 0
return stat.S_ISDIR(mode)
def clear_dir(path_):
if is_regular_dir(path_):
# Given path is a directory, clear its content
for name in os.listdir(path_):
fullpath = os.path.join(path_, name)
if is_regular_dir(fullpath):
shutil.rmtree(fullpath, onerror=_remove_readonly)
else:
force_remove_file_or_symlink(fullpath)
else:
# Given path is a file or a symlink.
# Raise an exception here to avoid accidentally clearing the content
# of a symbolic linked directory.
raise OSError("Cannot call clear_dir() on a symbolic link")
os.remove
、ユーティリティとは異なり、rm
あなたがファイルを所有している限り、読み取り専用ファイルを削除できます。一方、自分が所有していないファイルで、読み取り専用のアクセス権しか持っていない場合、そのファイルを削除したり、権限を変更したりすることはできません。システムで読み取り専用ファイルを削除できず、os.remove
そのアクセス許可を変更できない状況はわかりません。さらに、lchmod
そのドキュメントによれば、私のMacにもWindowsにも存在しないを使用しています。このコードはどのプラットフォーム向けですか?
誰もpathlib
この仕事をするのに素晴らしいことを言っていないことに驚いています。
ディレクトリ内のファイルのみを削除する場合は、ワンライナーにすることができます
from pathlib import Path
[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()]
ディレクトリを再帰的に削除するには、次のように記述します。
from pathlib import Path
from shutil import rmtree
for path in Path("/path/to/folder").glob("**/*"):
if path.is_file():
path.unlink()
elif path.is_dir():
rmtree(path)
.iterdir()
代わりに動作する.glob(...)
はずです。
import os
import shutil
# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]
# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]
以前のコメントでは、Python 3.5以降でのos.scandirの使用についても言及されています。例えば:
import os
import shutil
with os.scandir(target_dir) as entries:
for entry in entries:
if entry.is_file() or entry.is_symlink():
os.remove(entry.path)
elif entry.is_dir():
shutil.rmtree(entry.path)
os.path.isdir()
通常のディレクトリとシンボリックリンクを区別する有効な方法ではありません。shutil.rmtree()
シンボリックリンクを呼び出すと、OSError
例外が発生します。
私はこの方法で問題を解決していました:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
さらに別のソリューション:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
sh
は標準ライブラリの一部ではないため、使用する前にPyPIからインストールする必要があります。また、これは実際rm
にはサブプロセスで呼び出されるため、rm
存在しないWindowsでは機能しません。フォルダにサブディレクトリが含まれている場合も例外が発生します。
古いスレッドだと思いますが、pythonの公式サイトで面白いものを見つけました。ディレクトリ内のすべてのコンテンツを削除する別のアイデアを共有するためだけに。shutil.rmtree()を使用するときに承認の問題がいくつかあり、ディレクトリを削除して再作成したくありません。元のアドレスはhttp://docs.python.org/2/library/os.html#os.walkです。それが誰かを助けることを願っています。
def emptydir(top):
if(top == '/' or top == "\\"): return
else:
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
* nixシステムを使用している場合は、systemコマンドを活用してみませんか?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
限られた特定の状況に対する回答:サブフォルダーツリーを維持しながらファイルを削除する場合は、再帰的アルゴリズムを使用できます。
import os
def recursively_remove_files(f):
if os.path.isfile(f):
os.unlink(f)
elif os.path.isdir(f):
for fi in os.listdir(f):
recursively_remove_files(os.path.join(f, fi))
recursively_remove_files(my_directory)
少し話題から外れているかもしれませんが、多くの人が役に立つと思います
以下のメソッドを使用して、ディレクトリ自体ではなく、ディレクトリの内容を削除します。
import os
import shutil
def remove_contents(path):
for c in os.listdir(path):
full_path = os.path.join(path, c)
if os.path.isfile(full_path):
os.remove(full_path)
else:
shutil.rmtree(full_path)
フォルダ内のすべてのファイルを削除する/すべてのファイルを削除する最も簡単な方法
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
os.system('rm -rf folder')