这是文件夹树:
FOLDER\\
\\1\\file
\\2\\file
\\3\\
\\4\\file
脚本应扫描(循环)FOLDER 中的每个文件夹并检查子文件夹是否为空。如果是,则必须将其删除。
到目前为止,我的代码是这样的:
folders = ([x[0] for x in os.walk(os.path.expanduser('~\\Desktop\\FOLDER\\DIGITS\\'))])
folders2= (folders[1:])
此扫描文件夹,并使用
folders2
从 DIGITS
中的第一个文件夹开始。
在 DIGITS
中有编号的目录:1,2,3,4,etc
现在怎么办?尝试使用
os.rmdir
但它给了我一个错误,一些关于字符串的错误。事实上,folders2
是一个列表,而不是一个字符串,只是说...
不确定你会遇到什么样的错误,这对我来说非常有效:
import os
root = 'FOLDER'
folders = list(os.walk(root))[1:]
for folder in folders:
# folder example: ('FOLDER/3', [], ['file'])
if not folder[2]:
os.rmdir(folder[0])
您可以使用以下代码片段删除所有空文件夹和子文件夹。
import os
def remove_empty_folders(path_abs):
walk = list(os.walk(path_abs))
for path, _, _ in walk[::-1]:
if len(os.listdir(path)) == 0:
os.remove(path)
if __name__ == '__main__':
remove_empty_folders("your-path")
对其他答案进行扩展的一些内容:
如果您使用
os.walk(topdown=False)
,则会以相反的顺序进行,因此您会在父目录之前遇到子目录。然后,如果您跟踪已删除的目录,则可以递归删除父目录。
import os
def delete_empty_folders(root):
deleted = set()
for current_dir, subdirs, files in os.walk(root, topdown=False):
still_has_subdirs = any(
_ for subdir in subdirs
if os.path.join(current_dir, subdir) not in deleted
)
if not any(files) and not still_has_subdirs:
os.rmdir(current_dir)
deleted.add(current_dir)
return deleted
仅删除空文件夹:
import os
import shutil
if len(os.listdir(folder_path)) == 0: # Check if the folder is empty
shutil.rmtree(folder_path) # If so, delete it
import os
directory = r'path-to-directory'
for entry in os.scandir(directory):
if os.path.isdir(entry.path) and not os.listdir(entry.path) :
os.rmdir(entry.path)
在这里您可以找到 scandir
的很好的介绍/解释几乎是 Iván B. 所说的,但做了一些对我有用的小改动
import os, shutil
path_abs=('YourPath')
walk = list(os.walk(path_abs))
for path, _, _ in walk[::-1]:
if len(os.listdir(path)) == 0:
os.rmdir(path)
#LOOP THROUGH ALL SUBFOLDERS FIRST
import os
root = os.getcwd() #CHANGE THIS TO PATH IF REQUIRED
folders = sorted(list(os.walk(root))[1:],reverse=True)
for folder in folders:
try:
os.rmdir(folder[0])
except OSError as error:
print("Directory '{}' can not be removed".format(folder[0]))
这应该首先遍历所有子文件夹,然后删除空文件夹。不删除父文件夹的非空文件夹。
我知道这是一篇旧帖子,但我自己也老了!!!
对于空文件夹删除,您可以使用此代码片段。
import os
def drop_empty_folders(directory):
"""Verify that every empty folder removed in local storage."""
for dirpath, dirnames, filenames in os.walk(directory, topdown=False):
if not dirnames and not filenames:
os.rmdir(dirpath)
此答案解决了当前接受的答案中的问题。主要问题是删除目录的条件必须是
not filenames and not dirnames
。
import os
def remove_empty_directories(root):
for dirpath, dirnames, filenames in os.walk(root):
if not filenames and not dirnames:
os.rmdir(dirpath)
如果您使用的是 UNIX 系统,您可以在带有子进程的 python 脚本中使用“find”命令。
您可以使用以下命令搜索目录:-type d
您可以使用以下命令选择空目录:-empty
您可以使用以下命令删除这些目录:-delete
您可以使用 subprocess.run 启动命令
import subprocess
command = "find {} -type d -empty -delete".format(folder_path)
subprocess.run(command, shell=True)
只有3行代码。
按照@tripleee的建议,代码可以这样写:
import subprocess
path = "your path here"
command = ["find", path, "-type", "d", "-empty", "-delete"]
subprocess.run(command)
我建议你调用这个函数,它设计有一个可选参数。 如果您将
in_place
设置为 False
,它不会删除文件夹,只会将它们作为列表返回。同时,如果您将其设置为True
,无论子目录树深度如何,该功能都会删除空文件夹。
P.S. 如果您需要深度限制,您可以通过根路径之后的元素进行分析。
import os
import shutil
def purge_dir(dir, in_place=False):
deleted = []
dir_tree = list(os.walk(dir, topdown=False))
for tree_element in dir_tree:
sub_dir = tree_element[0]
is_empty = not len(os.listdir(sub_dir))
if is_empty:
deleted.append(sub_dir)
if in_place:
list(map(os.rmdir, deleted))
return deleted
我建议将
in_place
设置为False
返回空文件夹并根据需要使用它,因为它更安全,特别是对于安全关键应用程序。
这个问题解决了所有其他答案的问题。它可以避免给您一个
PermissionDenied
错误,从而阻止程序删除文件夹。
import os
import shutil
def remove_empty_folders(path_abs):
walk = list(os.walk(path_abs))
for path, _, _ in walk[::-1]:
if len(os.listdir(path)) == 0:
shutil.rmtree(path)
这是 @rcgale 答案的另一个版本。它用一组比较替换了any()循环来检查子目录。
def remove_empty_dirs(root_path):
deleted_dirs = set()
for current_dir, subdirs, files in os.walk(root_path, topdown=False):
still_has_subdirs = set(subdirs).intersection(deleted_dirs) != set(subdirs)
if not files and not still_has_subdirs:
os.rmdir(current_dir)
deleted_dirs.add(current_dir)
return deleted_dirs