You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:28:12