如何用Python递归删除所有空目录(含子目录删除后变为空的父级目录)
如何用Python递归删除所有空目录(含子目录删除后变为空的父级目录)
我明白你的痛点——原来的代码只能一次性删掉一开始就空的目录,没法自动处理子目录删除后变空的父目录,得反复运行太麻烦了。其实问题出在遍历顺序上:你原来的代码是从浅到深遍历目录(先处理父目录,再处理子目录),但咱们需要反过来,从最深的目录开始往上处理,这样删完子目录后,父目录变空了就能立刻检查到并删除。
下面给你两个可行的解决方案,都是基于这个核心思路:
方案一:修改遍历顺序(基于你原代码的快速改造)
只需要给你原有的目录列表按深度倒序排序,让最深的目录先被处理,就能解决问题。具体代码如下:
import os import glob DIR_DOCS = "data/docs" # 获取所有递归子目录,包括根目录本身 directories = glob.glob(f"{DIR_DOCS}/**/", recursive=True) # 按目录深度倒序排序(路径分隔符越多,目录越深) # os.sep 会自动适配Windows/macOS/Linux的路径分隔符 directories_sorted = sorted(directories, key=lambda x: x.count(os.sep), reverse=True) for directory in directories_sorted: # 可选:避免删除根目录本身(如果你的需求允许删根目录可以去掉这行) if directory == f"{DIR_DOCS}/": continue # 检查目录是否为空 if not os.listdir(directory): os.rmdir(directory) print(f"Removed directory: {directory}")
比如你举的例子:data/docs/TX/Fort Worth/2024-11-09/Meeting1/Test,排序后会先处理Test,删完后Meeting1变空,等遍历到Meeting1时就会检查到并删除,接着是2024-11-09,以此类推。
方案二:递归函数(更优雅的实现)
用递归的方式,先处理所有子目录,再检查当前目录是否为空。这种方式逻辑更清晰,也不需要依赖glob:
import os def remove_empty_dirs(path): # 先递归处理所有子目录:把每个子目录里的空目录都清干净 for entry in os.scandir(path): if entry.is_dir(follow_symlinks=False): remove_empty_dirs(entry.path) # 所有子目录处理完后,检查当前目录是否为空 if not os.listdir(path): os.rmdir(path) print(f"Removed directory: {path}") # 调用函数,传入根目录 DIR_DOCS = "data/docs" remove_empty_dirs(DIR_DOCS)
这个函数的逻辑是:进入一个目录后,先把所有子目录都递归处理一遍(子目录里的空目录全删完),然后再看当前目录是不是空的——如果是空的,就删掉它。完美匹配你需要的“子目录删空后,父目录空了也跟着删”的需求。
小提示
- 如果你担心误删根目录(比如
data/docs本身最后也变空了),可以在递归函数最后加个判断,比如如果当前路径是根目录就跳过删除。 os.scandir比os.listdir效率更高,尤其是处理大量目录时,推荐使用。
备注:内容来源于stack exchange,提问作者user3710004
相关产品推荐
相关产品推荐

