Python教程:编写查找大文件的文件清理工具,轻松管理磁盘空间

时间:2025-04-22作者:admin分类:Python教程浏览:13评论:0

[id_[id_1816442367]283327416]

Python教程:编写查找大文件的文件清理工具,轻松管理磁盘空间

以下是一个详细的 Python 教程,它会教你怎样去编写一个能够查找大文件的文件清理工具。这个教程将会被分成以下几个部分:

一、工具目标

[id_86157195]

列出文件大小超过设定阈值的文件

[id_1096262749]

支持自定义参数(如目录路径、大小阈值、结果数量)

二、实现步骤1. 导入所需库

import osimport argparsefrom pathlib import Path  # 可选,更现代的路径操作方式

2. 遍历目录并获取文件信息

使用os.walk递归遍历目录:

def scan_directory(directory):    file_list = [][id_1006410304]for root, dirs, files in os.walk(directory):        for file in files:文件路径等于将根目录与文件进行拼接,即 file_path 等于 os.path.join(root, file)            try:获取文件路径为 file_path 的文件大小并赋值给 file_size,即 file_size 等于 os.path.getsize(file_path) 这个函数获取到的文件大小。将(file_path, file_size)添加到 file_list 中。            except出现了 PermissionError 和 FileNotFoundError 这两种错误。                continue  # 跳过无法访问的文件    return file_list

3. 转换文件大小为易读格式

def convert_size(size_bytes):    units = ["B""KB""MB""GB""TB"]    index = 0    while size_bytes >= 1024 and index < len(units)-1:        size_bytes /= 1024        index += 1    return f"{size_bytes:.2f} {units[index]}"

4. 过滤和排序文件

def filter_and_sort(files, min_size=0, max_results=None):    # 过滤小于阈值的文件(min_size单位为字节)    filtered = [f for f in files if f[1] >= min_size]    # 按大小降序排序    sorted_files = sorted(filtered, key=lambda x: x[1], reverse=True)    # 限制结果数量    return sorted_files[:max_results] if max_results else sorted_files

5. 命令行参数解析

使用argparse处理用户输入:

def parse_args():parser 是 argparse.ArgumentParser 的实例,其 description 参数被设置为以下内容:"查找大文件工具")    parser.add_argument("directory"help="要扫描的目录路径")    parser.add_argument("-m""--min-size"type=int, default=100,                        help="最小文件大小(MB),默认100MB")    parser.add_argument("-n""--num-results"type=int,                        help="显示前N个最大文件")    return parser.parse_args()

6. 主函数整合逻辑

def main():    args = parse_args()min_size_bytes 等于 args.min_size 乘以某个值1024 * 1024  # 将MB转换为字节
    print(f"扫描目录: {args.directory}...")通过扫描指定的目录 args.directory 来获取文件列表,这些文件被存储在 files 中结果等于对文件进行过滤和排序操作,过滤条件是文件大小大于等于最小字节数,排序后的结果数量为指定的结果数量。具体来说,就是通过 filter_and_sort 函数对文件、最小字节数和指定的结果数量进行处理,得到最终的结果。
    print(f"\n找到 {len(results)} 个大于 {args.min_size}MB 的文件:")    for path, size in results:        print(f"{convert_size(size):>15} | {path}")

7. 完整代码

把上述代码片段整合到一个 Python 文件里面,比如 cleanup_tool.py 。if __name__ == "__main__":    main()

三、使用方法

通过命令行运行工具:

# 基本用法python清理工具.py 位于 /path/to/directory 路径下。
# 指定最小文件大小为500MB,显示前10个结果python使用 cleanup_tool.py 对 /path/to/directory 进行操作,指定参数为 -m 。500 -n 10

四、输出示例

扫描目录: /home/user/documents...
找到 8 个大于 100MB 的文件:      1.23 GB | /home/user/documents/video.mp4    845.23 MB | /home/user/documents/backup.zip    512.11 MB | /home/user/documents/game.iso    ...

五、扩展功能

添加--delete 参数后可直接删除文件,此操作需谨慎使用。

修改参数解析

def parse_args():    parser = argparse.ArgumentParser(description="查找大文件工具")    # ...原有参数...    parser.add_argument("--delete", action="store_true",                        help="启用删除模式(需二次确认)")    parser.add_argument("--force", action="store_true",                        help="跳过确认直接删除")    return parser.parse_args()

添加安全删除逻辑

def safe_delete(file_path, force=False):    try:        if not force:            confirm = input(f"确认删除 {file_path}?(y/N) ").lower()            if confirm != 'y':                return False        os.remove(file_path)        print(f"已删除: {file_path}")        return True    except Exception as e:        print(f"删除失败 [{e}]: {file_path}")        return Falsedef batch_delete(files, force=False):    deleted = []    for path, _ in files:        if safe_delete(path, force):将路径添加到已删除的列表中。    return deleted

排除目录:通过--exclude忽略特定文件夹

参数扩展

def parse_args():    # ...原有参数...    parser.add_argument("--exclude", nargs='+'default=[],                        help="排除的目录名(支持多个)")    return parser.parse_args()

修改扫描函数

def scan_directory(directory, exclude_dirs=None):    exclude = set(exclude_dirs or [])    file_list = []        for root, dirs, files in os.walk(directory):        # 排除指定目录        dirs[:] = [d for d in dirs if d not in exclude]                # 排除完整路径匹配        if any(exclude_path in root for exclude_path in exclude):            continue                    # ...原有文件处理逻辑...        return file_list

六、注意事项

权限问题:部分系统文件可能需要管理员权限才能访问

使用 os.path.islink()这个函数,就可以避免对链接文件进行处理。

性能优化方面,通过使用多线程来加速扫描,其中可以使用 concurrent.futures 这种方式。

如果需要更详细的解释或特定功能的实现,请告诉我!

最近处于失业在家的状态,时间较为充裕。倘若大家存在关于 UE(虚幻引擎)的相关问题,欢迎大家留言进行讨论!我会全力去研究并且解答,这样既能够帮助到大家,又能够让我自己得到学习和提升。我的能力虽然有限,但一定会认真对待每一个问题!对于已经解决的问题,我会将其整理成文章,然后在公众号上发布出来,与大家分享,希望能够给更多的人提供帮助!

你可能想看:

猜你喜欢