Pythonのローカルフォルダの内容を削除するにはどうすればいいですか?
現在のプロジェクトはWindows用ですが、* nixも見たいです。
ファイルのみを削除し、コメントに示されているos.path.join()
メソッドを使用するように更新しました。サブディレクトリも削除したい場合は、Elif
ステートメントのコメントを外します。
import os, shutil
folder = '/path/to/folder'
for the_file in os.listdir(folder):
file_path = os.path.join(folder, the_file)
try:
if os.path.isfile(file_path):
os.unlink(file_path)
#Elif os.path.isdir(file_path): shutil.rmtree(file_path)
except Exception as e:
print(e)
Shutilモジュールを試す
import shutil
shutil.rmtree('/path/to/folder')
説明:
shutil.rmtree(path, ignore_errors=False, onerror=None)
Docstring:ディレクトリツリーを再帰的に削除します。
ignore_errors
が設定されている場合、エラーは無視されます。それ以外の場合、onerror
が設定されていると、引数(func, path, exc_info)
でエラーを処理するために呼び出されます。ここで、func
はos.listdir
、os.remove
、またはos.rmdir
です; pathは、失敗の原因となったその関数の引数です。exc_info
は、sys.exc_info()
によって返されるタプルです。ignore_errors
がfalseでonerror
がNone
の場合、例外が発生します。
重要な注意:shutil.rmtree()
はターゲットフォルダーの内容を削除するだけではないことに注意してください。フォルダー自体も削除します。
これを簡単に実行できます。
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
もちろん、あなたのパスに他のフィルタを使うこともできます。
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))
rmtree
を使用してフォルダを再作成することはできますが、ネットワークドライブ上のフォルダを削除してすぐに再作成するとエラーが発生します。
Walkを使用する提案された解決策は、フォルダを削除するために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):
os.unlink(file_object_path)
else:
shutil.rmtree(file_object_path)
Onelinerとして:
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)) )
これがこれまでのところ唯一の答えです。
コード:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
他の多くの答えと同様に、これはファイル/ディレクトリの削除を可能にするためにパーミッションを調整することを試みません。
注:誰かが私の答えに賛成票を投じた場合に備えて、ここで説明することがあります。
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")
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.walk()
を使うほうがよいかもしれません。
os.listdir()
はファイルをディレクトリと区別しないので、これらのリンクを解除しようとするとすぐに問題に陥るでしょう。ここでos.walk()
を使ってディレクトリを再帰的に削除する 良い例があります 。そしてあなたの状況にどう適応するかについてのヒントがあります。
私はこのようにして問題を解決していました:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
私はそれが古いスレッドだと知っていますが、私は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))
もう一つの解決策:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
かなり直感的な方法:
import shutil, os
def remove_folder_contents(path):
shutil.rmtree(path)
os.makedirs(path)
remove_folder_contents('/path/to/folder')
あなたが* nixシステムを使っているなら、なぜシステムコマンドを利用しないのですか?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
以下の間にtime.sleep()
を追加することでrmtree
makedirs
の問題を解決しました。
if os.path.isdir(folder_location):
shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)
私はこの仕事をするための素晴らしい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)
単にこれをしてください。これはディレクトリ内だけでなくサブディレクトリからもすべてのファイルを削除します。フォルダ/ディレクトリに害を与えることなく。 Ubuntuでは問題なく動作します。
import os, re, os.path
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
for file in files:
os.remove(os.path.join(root, file))
限られた、特定の状況に対する答え:サブフォルダツリーを維持している間にファイルを削除したいと思うなら、再帰的なアルゴリズムを使うことができます:
import os
def recursively_remove_files(f):
if os.path.isfile(f):
os.unlink(f)
Elif os.path.isdir(f):
map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)])
recursively_remove_files(my_directory)
ちょっと話題が違うかもしれませんが、私は多くの人が役に立つと思うでしょう
フォルダ内のすべてのファイルを削除する/すべてのファイルを削除する最も簡単な方法
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
temp_dir
を削除すると仮定すると、os
を使用した単一行コマンドは次のようになります。
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
注:これはファイルを削除するための1行のみです 'ディレクトリを削除しません。
お役に立てれば。ありがとう。
以下のメソッドを使用して、ディレクトリ自体ではなく、ディレクトリの内容を削除します。
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)