第4讲:智能文件分类器——一秒归档杂乱文件夹 本讲目标掌握按多种规则分类文件的思路学会按扩展名、文件大小、修改日期三种策略分类实战案例一键整理下载目录一、场景描述你的下载文件夹是不是这样的GoogleSetup.exe 项目需求文档.pdf 微信图片_20260713.png team_meeting.mp4 数据报表.xlsx 乱七八糟.zip node-v18.17.0.msi 年会合照.jpg readme.txt installer.dmg每次找文件都要翻半天而且越积越多最后干脆不敢打开下载文件夹。上一讲我们做了按扩展名分类但实际工作中你可能还需要按文件大小分类小文件、大文件、超大文件按修改日期分类今天、本周、本月、更早按文件年龄分类新文件、旧文件、归档文件这一讲我们把这三种策略都实现并且做成一个可以选择策略的工具。二、策略一按扩展名分类升级版上一讲我们已经做过基础版这里做一个更完善的版本支持自定义分类规则。2.1 完整代码新建文件classify_by_type.pyimport os import shutil def classify_by_extension(source_dir): 按扩展名分类文件 # 分类规则文件夹名 → 扩展名列表 categories { 图片: [.jpg, .jpeg, .png, .gif, .bmp, .webp, .svg], 文档: [.docx, .doc, .pdf, .xlsx, .xls, .pptx, .ppt, .txt, .md, .csv, .json, .xml], 视频: [.mp4, .avi, .mov, .mkv, .wmv, .flv], 音频: [.mp3, .wav, .flac, .aac, .ogg], 压缩包: [.zip, .rar, .7z, .tar, .gz, .bz2], 安装包: [.exe, .msi, .dmg, .apk, .deb], 代码: [.py, .js, .java, .cpp, .html, .css, .sql, .sh], } # 统计处理结果 stats {name: 0 for name in categories} stats[未分类] 0 for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) # 跳过文件夹 if os.path.isdir(file_path): continue # 获取扩展名 _, ext os.path.splitext(filename) ext ext.lower() # 查找所属类别 moved False for folder_name, extensions in categories.items(): if ext in extensions: target_dir os.path.join(source_dir, folder_name) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[folder_name] 1 moved True break if not moved: # 未匹配的文件放入其他文件夹 other_dir os.path.join(source_dir, 其他) os.makedirs(other_dir, exist_okTrue) shutil.move(file_path, os.path.join(other_dir, filename)) stats[未分类] 1 return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按扩展名分类...) result classify_by_extension(folder) print(\n 整理结果) for category, count in result.items(): if count 0: print(f ✅ {category}: {count} 个文件) print( 整理完成)三、策略二按文件大小分类有时候你想把大文件挑出来单独处理比如把超过 100MB 的视频移到移动硬盘。3.1 完整代码新建文件classify_by_size.pyimport os import shutil def get_size_category(size_bytes): 根据文件大小返回分类名称 # 转换为 KB、MB、GB size_kb size_bytes / 1024 size_mb size_kb / 1024 size_gb size_mb / 1024 if size_gb 1: return 超大型_1GB以上, f{size_gb:.2f} GB elif size_mb 100: return 大型_100MB-1GB, f{size_mb:.2f} MB elif size_mb 10: return 中型_10MB-100MB, f{size_mb:.2f} MB elif size_mb 1: return 小型_1MB-10MB, f{size_mb:.2f} MB else: return 微型_1MB以下, f{size_kb:.2f} KB def classify_by_size(source_dir): 按文件大小分类 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue # 获取文件大小并分类 size_bytes os.path.getsize(file_path) category, size_str get_size_category(size_bytes) # 创建分类文件夹并移动 target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) # 统计 stats[category] stats.get(category, 0) 1 print(f {filename} ({size_str}) → {category}) return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按文件大小分类...) result classify_by_size(folder) print(\n 整理结果) for category, count in result.items(): print(f ✅ {category}: {count} 个文件) print( 整理完成)3.2 运行示例请输入要整理的文件夹路径C:\Users\admin\Downloads 正在按文件大小分类... node-v18.17.0.msi (152.34 MB) → 大型_100MB-1GB team_meeting.mp4 (85.23 MB) → 中型_10MB-100MB 数据报表.xlsx (3.45 MB) → 小型_1MB-10MB readme.txt (12.56 KB) → 微型_1MB以下 整理结果 ✅ 大型_100MB-1GB: 1 个文件 ✅ 中型_10MB-100MB: 1 个文件 ✅ 小型_1MB-10MB: 1 个文件 ✅ 微型_1MB以下: 1 个文件 整理完成四、策略三按修改日期分类这个策略特别适合整理照片和工作文件按时间归档一目了然。4.1 完整代码新建文件classify_by_date.pyimport os import shutil from datetime import datetime, date def get_date_category(mod_timestamp): 根据修改时间返回分类名称 mod_date datetime.fromtimestamp(mod_timestamp).date() today date.today() # 计算天数差 days_diff (today - mod_date).days if days_diff 0: return 今天 elif days_diff 1: return 昨天 elif days_diff 7: return 本周 elif days_diff 30: return 本月 elif days_diff 90: return 近三个月 elif days_diff 180: return 近半年 else: # 超过半年的按年月分类 return mod_date.strftime(%Y年%m月) def classify_by_date(source_dir): 按修改日期分类 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue # 获取文件修改时间 mod_timestamp os.path.getmtime(file_path) category get_date_category(mod_timestamp) # 创建分类文件夹并移动 target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) # 统计 stats[category] stats.get(category, 0) 1 mod_date datetime.fromtimestamp(mod_timestamp).strftime(%Y-%m-%d) print(f {filename} (修改于 {mod_date}) → {category}) return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按修改日期分类...) result classify_by_date(folder) print(\n 整理结果) for category, count in sorted(result.items()): print(f ✅ {category}: {count} 个文件) print( 整理完成)五、综合版三合一分类工具箱把三种策略整合到一个脚本中运行时让用户选择用哪种方式。5.1 完整代码新建文件smart_classifier.pyimport os import shutil from datetime import datetime, date def show_menu(): 显示菜单 print(\n *40) print( 智能文件分类器) print(*40) print(1. 按扩展名分类图片/文档/视频等) print(2. 按文件大小分类微型/小型/中型/大型) print(3. 按修改日期分类今天/本周/本月等) print(0. 退出) print(*40) def classify_by_extension(source_dir): 按扩展名分类 categories { 图片: [.jpg, .jpeg, .png, .gif, .bmp, .webp, .svg], 文档: [.docx, .doc, .pdf, .xlsx, .xls, .pptx, .ppt, .txt, .md, .csv, .json, .xml], 视频: [.mp4, .avi, .mov, .mkv, .wmv, .flv], 音频: [.mp3, .wav, .flac, .aac, .ogg], 压缩包: [.zip, .rar, .7z, .tar, .gz, .bz2], 安装包: [.exe, .msi, .dmg, .apk, .deb], 代码: [.py, .js, .java, .cpp, .html, .css, .sql, .sh], } stats {name: 0 for name in categories} stats[其他] 0 for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue _, ext os.path.splitext(filename) ext ext.lower() moved False for folder_name, extensions in categories.items(): if ext in extensions: target_dir os.path.join(source_dir, folder_name) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[folder_name] 1 moved True break if not moved: other_dir os.path.join(source_dir, 其他) os.makedirs(other_dir, exist_okTrue) shutil.move(file_path, os.path.join(other_dir, filename)) stats[其他] 1 return stats def classify_by_size(source_dir): 按文件大小分类 def get_category(size_bytes): size_mb size_bytes / 1024 / 1024 if size_mb 1000: return 超大型_1GB以上 elif size_mb 100: return 大型_100MB-1GB elif size_mb 10: return 中型_10MB-100MB elif size_mb 1: return 小型_1MB-10MB else: return 微型_1MB以下 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue size_bytes os.path.getsize(file_path) category get_category(size_bytes) target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[category] stats.get(category, 0) 1 size_mb size_bytes / 1024 / 1024 print(f {filename} ({size_mb:.2f} MB)) return stats def classify_by_date(source_dir): 按修改日期分类 def get_category(mod_timestamp): mod_date datetime.fromtimestamp(mod_timestamp).date() today date.today() days_diff (today - mod_date).days if days_diff 0: return 今天 elif days_diff 7: return 本周 elif days_diff 30: return 本月 elif days_diff 90: return 近三个月 else: return mod_date.strftime(%Y年%m月) stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue mod_timestamp os.path.getmtime(file_path) category get_category(mod_timestamp) target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[category] stats.get(category, 0) 1 mod_date datetime.fromtimestamp(mod_timestamp).strftime(%Y-%m-%d) print(f {filename} (修改于 {mod_date})) return stats if __name__ __main__: while True: show_menu() choice input(请选择分类方式 (0-3)).strip() if choice 0: print( 再见) break if choice not in [1, 2, 3]: print(❌ 无效选择请重新输入) continue folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) continue print( 正在整理...) if choice 1: result classify_by_extension(folder) elif choice 2: result classify_by_size(folder) elif choice 3: result classify_by_date(folder) print(\n 整理结果) for category, count in sorted(result.items()): if count 0: print(f ✅ {category}: {count} 个文件) print( 整理完成)六、使用技巧与注意事项6.1 先备份再整理对于重要的文件夹建议先复制一份到别处再运行分类脚本。6.2 排除不想移动的文件在遍历时加入排除名单exclude_files [smart_classifier.py, 整理说明.txt] if filename in exclude_files: continue6.3 预览模式在实际移动前先打印将要执行的操作print( 预览操作) for filename in os.listdir(source_dir): # ... 判断逻辑 ... print(f 将移动: {filename} → {target_folder}) confirm input(确认执行(y/n): ) if confirm.lower() ! y: print(已取消) exit()七、本讲总结分类策略适用场景核心代码按扩展名日常文件整理os.path.splitext()按文件大小磁盘空间清理os.path.getsize()按修改日期照片/文档归档os.path.getmtime()三合一工具箱通用场景整合以上三种八、课后练习给按扩展名分类增加一个字体类别.ttf,.otf,.woff修改按日期分类的逻辑让超过一年的文件按2025年、2026年这样按年份分类挑战题给三合一工具箱增加第四个选项——按文件所有者分类提示用os.stat().st_uid下一讲预告​ 重复文件清扫员——释放你的磁盘空间。

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/21 18:32:40
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/21 18:32:39
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/21 18:31:24
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/21 18:31:34
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 18:31:25
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/21 18:31:13

日新闻

周新闻