如何删除文件夹的内容?
- 2025-03-05 09:15:00
- admin 原创
- 60
问题描述:
如何在 Python 中删除本地文件夹的内容?
当前项目是针对 Windows 的,但我也想看到 *nix。
解决方案 1:
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))
解决方案 2:
你可以简单地这样做:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
os.remove(f)
当然,您可以在路径中使用其他过滤器,例如:/YOU/PATH/*.txt 用于删除目录中的所有文本文件。
解决方案 3:
您可以使用以下命令删除文件夹本身及其所有内容shutil.rmtree
:
import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)
删除整个目录树;路径必须指向目录(但不能是指向目录的符号链接)。如果ignore_errors为真,则将忽略因删除失败而导致的错误;如果为假或省略,则通过调用onerror指定的处理程序来处理此类错误,如果省略,则引发异常。
解决方案 4:
扩展 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))
解决方案 5:
我很惊讶没有人提到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)
解决方案 6:
使用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)
解决方案 7:
在 Python 3.6+ 中使用os.scandir 和上下文管理器协议:
import os
import shutil
with os.scandir(target_dir) as entries:
for entry in entries:
if entry.is_dir() and not entry.is_symlink():
shutil.rmtree(entry.path)
else:
os.remove(entry.path)
早期版本的 Python:
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
[shutil.rmtree(i) if os.path.isdir(i) and not os.path.islink(i) else os.remove(i) for i in contents]
解决方案 8:
这:
删除所有符号链接
+ 死链接
+ 目录链接
+ 文件链接
删除子目录
不删除父目录
代码:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
与许多其他答案一样,这不会尝试调整权限以允许删除文件/目录。
解决方案 9:
注意:如果有人反对我的回答,我在这里需要解释一下。
每个人都喜欢简短的答案。然而,有时事实并非如此简单。
回到我的答案。我知道
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")
解决方案 10:
一句话:
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)) )
解决方案 11:
我曾经以这种方式解决问题:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
解决方案 12:
要删除文件夹 a 内的所有文件,我使用:
import os
for i in os.listdir():
os.remove(i)
解决方案 13:
要删除目录及其子目录内的所有文件(而不删除文件夹本身),只需执行以下操作:
import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath, topdown=False):
for file in files:
os.remove(os.path.join(root, file))
# Add this block to remove folders
for dir in dirs:
os.rmdir(os.path.join(root, dir))
# Add this line to remove the root folder at the end
os.rmdir(mypath)
解决方案 14:
如果您使用的是 *nix 系统,为什么不利用系统命令呢?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
解决方案 15:
您最好使用os.walk()
它。
os.listdir()
不区分文件和目录,您在尝试取消链接时很快就会遇到麻烦。这里os.walk()
有一个使用递归删除目录的很好示例,并提示了如何根据您的情况进行调整。
解决方案 16:
我知道这是一个老话题,但我从 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))
解决方案 17:
我必须从单个父目录内的 3 个独立文件夹中删除文件:
directory
folderA
file1
folderB
file2
folderC
file3
这个简单的代码对我来说很管用:(我在Unix上)
import os
import glob
folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
file = glob.glob(f'{fo}/*')
for f in file:
os.remove(f)
希望这有帮助。
解决方案 18:
另一个解决方案:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
解决方案 19:
嗯,我认为此代码有效。它不会删除该文件夹,您可以使用此代码删除具有特定扩展名的文件。
import os
import glob
files = glob.glob(r'path/*')
for items in files:
os.remove(items)
解决方案 20:
使用此功能
import os
import glob
def truncate(path):
files = glob.glob(path+'/*.*')
for f in files:
os.remove(f)
truncate('/my/path')
解决方案 21:
非常直观的做法:
import shutil, os
def remove_folder_contents(path):
shutil.rmtree(path)
os.makedirs(path)
remove_folder_contents('/path/to/folder')
解决方案 22:
针对有限的特定情况进行回答:假设您想要删除文件同时维护子文件夹树,则可以使用递归算法:
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)
可能有点题外,但我认为很多人会觉得它有用
解决方案 23:
我尝试了其他方法,包括 os 和 glob 包,遇到了权限问题,但使用这个方法,我没有遇到权限问题,而且少用了一个包。如果子目录存在,可能会失败。
import os
def remove_files_in_folder(folderPath):
# loop through all the contents of folder
for filename in os.listdir(folderPath):
# remove the file
os.remove(f"{folderPath}/{filename}")
remove_files_in_folder('./src/inputFiles/tmp')
文件夹结构
root
|
+-- main.py
|
+-- src
|
+-- inputFiles
|
+-- tmp
|
+-- file1.txt
+-- img1.png
解决方案 24:
rglob()
以下是使用的解决方案pathlib
。请注意Path.rglob("*")
(和Path.glob("*")
)将包含隐藏文件。还请注意,我们不能使用Path.rmdir()
,因为它只能删除空目录。这就是为什么我们需要使用shutil.rmtree()
来删除目录。
from pathlib import Path
import shutil
folder = Path("/path/to/folder")
for item in folder.rglob("*"):
try:
if item.is_dir():
shutil.rmtree(item)
else:
item.unlink()
except OSError as ose:
print(f"Failed to delete {item}. {ose}")
解决方案 25:
使用下面的方法删除目录的内容,而不是目录本身:
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)
解决方案 26:
rmtree
makedirs
我通过添加以下内容解决了该问题time.sleep()
:
if os.path.isdir(folder_location):
shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)
解决方案 27:
如果你像我一样使用超棒的PyFilesystem2库,那么你就可以使用文档中描述的现成解决方案。
例如,要清除用户主目录下的目录而不删除目录本身,请结合使用: Videos
`FS.removetree`FS.opendir
import fs
home_fs = fs.open_fs("~")
home_fs.opendir("/Videos").removetree("/")
home_fs.exists("/Videos") # True
home_fs.isempty("/Videos") # True
解决方案 28:
删除文件夹中所有文件/删除所有文件的最简单方法
import os
files = os.listdir(yourFilePath)
for f in files:
os.remove(yourFilePath + f)
解决方案 29:
只需使用 OS 模块列出然后删除就可以了!
import os
DIR = os.list('Folder')
for i in range(len(DIR)):
os.remove('Folder'+chr(92)+i)
对我有用,有任何问题请告诉我!
扫码咨询,免费领取项目管理大礼包!