我的下载文件夹长这样——安装包、PDF、图片、压缩包、文档、视频全堆在一起,像是一个没人收拾的杂物间。
每次想找个文件都特别痛苦。上周我要找一份三天前下的合同PDF,在那一堆文件里翻了好几分钟,眼睛都看花了才找到。当时我就想,这太蠢了,为什么我不能让电脑自动帮我分类?
手动建文件夹再一个一个拖进去?我试过,坚持了不到一周就放弃了。刚开始几天还挺有干劲,后来一忙起来就忘了,等到想起来的时候,下载文件夹又堆了几十个新文件,看着就心累,干脆摆烂。
后来我想到了WorkBuddy——它本来就能生成代码,我只需要说清楚我要什么就行。那就试试吧,反正也不用我自己从头写。
#WorkBuddy#说了什么
打开#WorkBuddy#
,在对话框里我直接打了这么一段话:
帮我写一个Python脚本,把我电脑"下载"文件夹里的文件按类型自动归类到子文件夹,分类包括图片、文档、压缩包、视频、音频、安装包、代码。重名的文件不要覆盖,顺便告诉我一共移动了多少个文件。
就这么一句话,没有加任何专业术语,就是大白话。
过了大概十几秒,它就给我吐出了一整段代码,还附带了解释。说实话我有点意外,本来以为至少要多轮对话才能搞定,结果一次性就出来了。
python
import os
import shutil
from pathlib import Path
from datetime import datetime
# 配置区
SOURCE = Path.home() / "Downloads"
CATEGORIES = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".bmp"],
"文档": [".pdf", ".doc", ".docx", ".txt", ".md", ".ppt", ".pptx", ".xls", ".xlsx"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"视频": [".mp4", ".mov", ".avi", ".mkv", ".webm"],
"音频": [".mp3", ".wav", ".flac", ".aac"],
"安装包": [".exe", ".dmg", ".pkg", ".apk"],
"代码": [".py", ".js", ".html", ".css", ".json", ".xml", ".java", ".cpp", ".c"]
}
def organize_files():
if not SOURCE.exists():
print(f"目录不存在: {SOURCE}")
return
moved_count = 0
skipped_count = 0
for file in SOURCE.iterdir():
if file.is_dir():
continue
suffix = file.suffix.lower()
moved = False
for category, extensions in CATEGORIES.items():
if suffix in extensions:
target_dir = SOURCE / category
target_dir.mkdir(exist_ok=True)
target_path = target_dir / file.name
if target_path.exists():
timestamp = datetime.now().strftime("%H%M%S")
new_name = f"{file.stem}_{timestamp}{file.suffix}"
target_path = target_dir / new_name
shutil.move(str(file), str(target_path))
moved_count += 1
moved = True
print(f"已移动: {file.name} -> {category}/")
break
if not moved:
print(f"跳过: {file.name} (未分类)")
skipped_count += 1
print("\n" + "="*40)
print(f"整理完成!共移动 {moved_count} 个文件")
print(f"跳过 {skipped_count} 个文件")
print("="*40)
if __name__ == "__main__":
organize_files()代码本身不算复杂,核心逻辑就是遍历文件、匹配后缀名、然后移动到对应的子文件夹。如果目标文件夹不存在就自动创建,如果重名就加个时间戳区分。
代码拿过来之后我直接保存成 organize_downloads.py ,然后在终端里跑了一下。
第一次跑的时候报错了,提示路径不存在。我检查了一下才发现,我的Windows用户名是中文的,Path.home() 返回的路径里包含了中文,而Python在某些环境下的编码处理会有问题。
解决办法其实很简单,不用 Path.home() ,直接把下载文件夹的绝对路径写死:
python
SOURCE = Path("D:/Downloads") # 改成你自己的实际路径改了之后就能正常跑了。
另外还有一个情况,如果你用的是Mac,路径格式会不一样,需要写成 /Users/你的用户名/Downloads 。这些细节WorkBuddy生成的代码里可能不会自动适配,拿到之后要根据自己的系统稍微改一下。
跑完之后的输出大概是这样:
text
已移动: 项目需求文档.pdf -> 文档/
已移动: 风景图片.png -> 图片/
已移动: setup.exe -> 安装包/
已移动: 视频教程.mp4 -> 视频/
跳过: temp.tmp (未分类)运行完之后,原来的下载文件夹下面多了这几个子文件夹:
所有文件按后缀名自动分好类,该进哪进哪。那些没识别出来的文件(比如 .tmp 或者一些不常见格式)就留在原地不动,不会被误删或者误移动,这点我觉得设计得挺稳妥的。
我特意看了一下,移动速度很快,一两百个文件几秒钟就处理完了,不会有卡顿。
脚本跑通了之后我就想,能不能让它每天自动运行一次,省得我手动去点。
然后在WorkBuddy的自动化里面新建了一个任务,配置大致是这样:
填好之后保存,WorkBuddy会自动帮你把调度配置好。第二天下午6点我特意观察了一下,终端自动弹出来跑了一遍,下载文件夹整整齐齐的。
说实话,这种"设置一次就再也不用管"的感觉确实挺爽的。
基础功能跑通之后,我还根据自己的一些使用习惯做了一点小调整,给你们参考一下:
1. 忽略特定文件
我的下载文件夹里经常会有一些正在下载中的临时文件(比如浏览器下载到一半的 .crdownload 文件),这些文件如果在下载过程中被移动,下载就会失败。所以我在遍历的时候加了一个过滤条件:
我的下载文件夹里经常会有一些正在下载中的临时文件(比如浏览器下载到一半的 .crdownload 文件),这些文件如果在下载过程中被移动,下载就会失败。所以我在遍历的时候加了一个过滤条件:
python
ignore_extensions = [".crdownload", ".tmp", ".part"]
if file.suffix.lower() in ignore_extensions:
continue2. 把"安装包"单独拎出来
最开始"安装包"和"压缩包"是放在一起的,后来我发现每次下载的软件安装包 .exe 文件太多了,和 .zip 混在一起找起来不方便,就单独拆了一个"安装包"类别。
2. 把"安装包"单独拎出来
最开始"安装包"和"压缩包"是放在一起的,后来我发现每次下载的软件安装包 .exe 文件太多了,和 .zip 混在一起找起来不方便,就单独拆了一个"安装包"类别。
这个完全看个人习惯,你想怎么分就怎么分,改 CATEGORIES 字典就行。
3. 桌面也一起整理了
后来我觉得既然下载文件夹能整理,桌面是不是也可以?我把 SOURCE 改成了 Path.home() / "Desktop" ,效果一样好。如果你愿意,可以复制一份脚本专门整理桌面。
这个脚本我到现在已经跑了大概两周了,每天自动运行一次。
最直观的变化就是,我再也不用面对那个乱糟糟的下载文件夹了。每次打开下载目录,看到文件整整齐齐地分在对应的文件夹里,心里确实舒服很多。找文件的时候直接去对应的分类文件夹翻,效率比以前高了不少。
而且说实话,整个过程我真正做的就只有两件事:跟WorkBuddy说了一句话,然后复制粘贴保存。如果让我自己从头写这个脚本,虽然也不是写不出来,但至少得查查 shutil.move 的用法、处理一下异常情况、考虑一下边界条件,怎么说也得折腾半小时。现在几分钟就搞定了,省下来的时间干点别的不好吗。
这个脚本其实只是一个很基础的文件操作,但思路可以复用。我自己打算后面再让WorkBuddy帮我写几个类似的小工具:
如果你也有类似的需求,可以试试用同样的方式让WorkBuddy帮你写代码。关键是要把需求说清楚——要处理什么文件夹、按什么规则分类、异常情况怎么处理——剩下的交给它就行。
整个过程下来我做的事情就是:
就没别的了。
如果你也有那种"重复、机械、有固定规则"的日常操作,不妨试试让WorkBuddy帮你写成自动化脚本。不一定非得会编程,说清楚需求就行了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。