Answers:
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)
删除整个目录树;路径必须指向目录(但不能指向目录的符号链接)。如果ignore_errors为true,则删除失败导致的错误将被忽略;如果为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
用于分割目录和文件,必须以不同的方式处理。您也可以使用os.listdir
,但是您必须手动检查每个条目是目录还是文件。
os.walk
这里不会递归,因为它返回一个生成器,当您尝试推进它时,它仅以递归方式查看子目录,并且当您完成此循环的第一次迭代时,没有子目录左看。本质上,os.walk
这里只是将其用作区分顶级文件夹和顶级文件的另一种方法。没有使用递归,因此我们不为此付出任何性能成本。但是,它很古怪,我同意您建议的方法更好,因为它更明确,更易读。
使用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) 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
此处进行检查以正确处理目录的符号链接。我已经在接受的答案中添加了这样的支票。
作为单线:
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))
好吧,我认为这段代码可以正常工作。它不会删除该文件夹,您可以使用此代码删除具有特定扩展名的文件。
import os
import glob
files = glob.glob(r'path/*')
for items in files:
os.remove(items)
回答有限的特定情况:假设您要在维护子文件夹树时删除文件,则可以使用递归算法:
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)
也许有点题外话,但我认为许多人会觉得有用
os.walk
以stackoverflow.com/a/54889532/1709587所示的方式使用,可能是删除所有文件的完整方法,同时保持目录结构完整。
使用下面的方法删除目录的内容,而不是目录本身:
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')