联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:18888888888 QQ:

Python 智能递归清理工具:空文件夹消失术

在日常管理文件和目录时,我们经常会遇到大量空文件夹的情况。它们可能是软件卸载后残留的目录、手动整理文件时留下的空文件夹,或者是某些自动化程序运行后遗留下来的。这些空文件夹虽然不占空间,但会让目录结构变得混乱、不便于管理。因此,我们需要一种简单、高效的方式来清理这些无用的空文件夹。

本脚本一个基于 Python 的智能递归清理工具,它可以扫描指定目录及其子目录中的所有空文件夹,并提供交互式操作,允许用户:

  1. 手动选择删除某些空文件夹

  2. 一键删除所有空文件夹

3. 自动递归删除空文件夹的父目录(如果父目录也是空的)

功能介绍

本 Python 脚本的主要功能包括:

  • 扫描指定目录及其子目录中的所有空文件夹

  • 用户交互式删除:可手动选择删除特定空文件夹,或一键删除所有空文件夹

  • 递归删除空的父目录:当删除空文件夹后,如果其父目录也为空,则继续删除

- 异常处理:避免因权限问题、目录锁定等导致程序崩溃

代码详解

1. 代码结构

整个程序主要由以下 3 个核心函数组成:

  1. find_empty_dirs(directory) - 扫描并返回所有空文件夹

  2. delete_directory(directory_path) - 递归删除空文件夹及其空的父目录

  3. 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. 运行示例

假设我们有如下目录结构:

test_folder/
├── empty_1/
├── empty_2/
├── non_empty/
│   ├── file.txt
└── nested_empty/
    └── sub_empty/

其中:

  • empty_1/empty_2/ 是空文件夹

  • nested_empty/sub_empty/ 也是空的,但它的父目录 nested_empty/ 也是空的

运行脚本

(1)用户输入扫描目录

请输入要扫描的目录路径: test_folder

(2)程序列出空文件夹

以下是空文件夹列表:
1. test_folder/empty_1
2. test_folder/empty_2
3. test_folder/nested_empty/sub_empty

(3)用户选择删除部分空文件夹

请输入要删除的文件夹编号(多个编号用逗号分隔,输入 'all' 删除所有空文件夹,按q退出): 1, 3

程序输出:

已删除空文件夹: test_folder/empty_1
已删除空文件夹: test_folder/nested_empty/sub_empty
父目录空,删除父目录: test_folder/nested_empty

由于 nested_empty/sub_empty/ 删除后也为空,因此被递归删除。

5. 总结

本 Python 脚本提供了一种高效的方法来清理空文件夹,其特点包括:
智能扫描:递归遍历目录,精准识别空文件夹
交互式操作:用户可选择删除部分或所有空文件夹
递归删除:自动清理空的父目录,避免残留
安全可靠:删除前提供确认,防止误操作

相关文章

neo4j部署手册
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
DataX和DataX-WEB 安装步骤
DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、 MaxCompute(ODPS)、Hologres、DRDS, databend 等各种异构数据源之间高效的数据同步功能。
K8S集群搭建手册(集群版)
kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Apollo部署手册
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册