第4讲:智能文件分类器——一秒归档杂乱文件夹

发布时间:2026/9/13 0:54:37

第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下一讲预告​ 重复文件清扫员——释放你的磁盘空间。
延伸阅读

更多相关文章

2026/9/5 9:17:25

创造新技能并不断迭代改进现有技能的能力Skill

从宏观层面来说,技能的培养过程大致如下: 确定你希望这项技能实现什么功能,以及它大致应该如何实现。撰写一份技能草案创建一些测试提示,并运行 claude-with-access-to-the-skill 命令来测试它们。帮助用户对结果进行定性和定量评…

2026/9/12 21:06:45

2026系规备考风向标:老金给考生的三条“反常识”黄金建议

备战2026年软考系统规划与管理师,很多同学还在沿用旧教材的老套路,或者抱着历年真题死记硬背。作为常年在一线摸爬滚打的讲师,我想提醒大家:2026年的系规考试,正在发生你看不到的巨变。 针对今年的备考,我有…

2026/9/11 15:55:10

YOLOv11在树莓派上的推理优化:CPU速度提升43%是怎么做到的?

引言:当“目标检测卷王”遇上“百元板卡” 家人们谁懂啊!当我拿着那台仅需几百块的树莓派,成功把号称“目标检测天花板”的YOLOv11跑起来的时候,那种“小马拉大车”的成就感,比中了奶茶第二杯半价还爽! 很多人觉得树莓派就是个“玩具板卡”,YOLOv11这种前沿AI模型只能…

2026/9/13 0:51:45

从数据可视化到影视数据分析大屏:建模、SQL与ECharts实践

简介:这是面向数据可视化学习与二次开发的影视数据分析展示系统压缩包,围绕影视数据的采集、处理、建模与可视化展示形成完整案例,既适合新手按照资料动手练习,也方便开发者在此基础上扩展功能。压缩包共273个文件,大小…

2026/9/13 0:46:44

智能体架构演进:从ReAct到LangGraph的技术解析

1. 智能体架构演进与核心价值在人工智能领域,智能体(Agent)架构的发展正在重塑人机交互的方式。从早期的ReAct框架到如今的LangGraph,我们见证了智能体从单一任务执行者向复杂问题解决者的转变。这种演进不仅仅是技术栈的更新,更是思维模式的…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码