Python 智能递归清理工具:空文件夹消失术
本脚本一个基于 Python 的智能递归清理工具,它可以扫描指定目录及其子目录中的所有空文件夹,并提供交互式操作,允许用户:
手动选择删除某些空文件夹
一键删除所有空文件夹
3. 自动递归删除空文件夹的父目录(如果父目录也是空的)
功能介绍
本 Python 脚本的主要功能包括:
扫描指定目录及其子目录中的所有空文件夹
用户交互式删除:可手动选择删除特定空文件夹,或一键删除所有空文件夹
递归删除空的父目录:当删除空文件夹后,如果其父目录也为空,则继续删除
- 异常处理:避免因权限问题、目录锁定等导致程序崩溃
代码详解
1. 代码结构
整个程序主要由以下 3 个核心函数组成:
find_empty_dirs(directory)
- 扫描并返回所有空文件夹delete_directory(directory_path)
- 递归删除空文件夹及其空的父目录main()
- 提供交互式操作,列出空文件夹,供用户选择删除
2. 代码实现
import os
def find_empty_dirs(directory):
"""
扫描指定目录及子目录下的所有空文件夹
:param directory: 要扫描的目录
:return: 空文件夹的列表
"""
empty_dirs = [] # 存储空文件夹的路径列表
# os.walk 遍历指定目录及其子目录,topdown=False 确保先遍历子目录
for root, dirs, files in os.walk(directory, topdown=False):
# 如果目录中既没有文件也没有子目录,则认为该目录为空
if not dirs and not files: # 检查文件夹是否为空
empty_dirs.append(root) # 将空文件夹的路径添加到列表
return empty_dirs # 返回空文件夹路径的列表
def delete_directory(directory_path):
"""
删除指定的空文件夹,如果其父目录为空,则也删除父目录
:param directory_path: 要删除的空文件夹路径
"""
try:
# 删除目标空文件夹
os.rmdir(directory_path)
print(f"已删除空文件夹: {directory_path}")
# 获取该空文件夹的父目录
parent_dir = os.path.dirname(directory_path)
# 检查父目录是否为空
if not os.listdir(parent_dir): # 如果父目录没有任何内容(即为空)
print(f"父目录空,删除父目录: {parent_dir}")
delete_directory(parent_dir) # 递归删除父目录
except Exception as e:
# 如果删除操作失败(如权限问题等),打印错误信息
print(f"删除失败 {directory_path}: {e}")
def main():
"""
主函数,执行目录扫描并提供删除空文件夹的选项
"""
# 用户输入要扫描的目录路径
directory = input("请输入要扫描的目录路径: ")
# 检查输入路径是否有效
if not os.path.isdir(directory):
print("无效的目录路径,请重新输入.")
return
# 调用函数扫描空文件夹
empty_dirs = find_empty_dirs(directory)
# 如果没有找到空文件夹,提示用户
if not empty_dirs:
print("没有找到空文件夹.")
return
# 列出所有空文件夹
print("\n以下是空文件夹列表:")
for idx, dir in enumerate(empty_dirs, 1):
print(f"{idx}. {dir}")
# 提示用户选择要删除的空文件夹
choice = input("\n请输入要删除的文件夹编号(多个文件夹用逗号分隔,按q退出,输入 'all' 删除所有空文件夹): ")
# 用户输入‘q’表示退出程序
if choice.lower() == 'q':
print("退出程序.")
return
# 用户输入‘all’表示删除所有空文件夹
if choice.lower() == 'all':
confirm = input("你确定要删除所有空文件夹吗?(y/n): ")
if confirm.lower() == 'y': # 确认删除
for dir in empty_dirs:
delete_directory(dir) # 删除所有空文件夹
return # 完成删除后退出函数
else:
print("已取消删除操作.") # 如果用户取消
return
try:
# 处理用户输入的文件夹编号,支持多个编号用逗号分隔
indices = [int(x.strip()) - 1 for x in choice.split(',')] # 转换为对应的索引(从0开始)
for index in indices:
if 0 <= index < len(empty_dirs): # 如果编号有效
delete_directory(empty_dirs[index]) # 删除该文件夹
else:
print(f"无效编号: {index + 1}") # 如果编号超出范围
except ValueError:
# 如果用户输入了无效的编号(如非数字字符)
print("输入无效,请输入有效的文件夹编号.")
if __name__ == "__main__":
# 程序从这里开始执行
main()
3. 代码讲解
(1)扫描空文件夹
find_empty_dirs(directory)
函数用于遍历指定目录及其子目录,并找出所有空文件夹:
使用
os.walk()
递归遍历目录结构通过
not dirs and not files
判断文件夹是否为空将空文件夹路径存入
empty_dirs
列表并返回
(2)删除空文件夹
delete_directory(directory_path)
函数的作用是:
删除指定的空文件夹
递归检查父目录,如果父目录也为空,则继续删除,直到遇到非空目录或根目录
(3)用户交互
main()
函数用于:
获取用户输入的目录路径
调用
find_empty_dirs()
扫描空文件夹提供交互式界面,让用户选择删除单个、多个或全部空文件夹
- 调用 delete_directory()
执行删除
4. 运行示例
假设我们有如下目录结构:
其中:
empty_1/
和empty_2/
是空文件夹nested_empty/sub_empty/
也是空的,但它的父目录nested_empty/
也是空的
运行脚本
(1)用户输入扫描目录
(2)程序列出空文件夹
(3)用户选择删除部分空文件夹
程序输出:
由于 nested_empty/
在 sub_empty/
删除后也为空,因此被递归删除。
5. 总结
本 Python 脚本提供了一种高效的方法来清理空文件夹,其特点包括:
✅ 智能扫描:递归遍历目录,精准识别空文件夹
✅ 交互式操作:用户可选择删除部分或所有空文件夹
✅ 递归删除:自动清理空的父目录,避免残留
✅ 安全可靠:删除前提供确认,防止误操作
评论