用 pathlib 与 argparse 写一个可复用的 Python 文件整理小工具
下载文件夹是不是经常变成一个“什么都有”的大杂烩?截图、安装包、表格、压缩包混在一起,找一个文件要翻很久。手动整理一次不难,难的是坚持。我的做法是写一个只有一百多行的小脚本,每周运行一次,让规则代替耐心。本文用 Python 的 pathlib 和 argparse 实现它,思路简单,也方便以后扩展。
先定规则,再写代码
整理的第一步不是写代码,而是把规则写清楚。这个小工具只做三件事:按扩展名把文件分到不同文件夹,遇到重名文件不覆盖,运行前可以先预览。规则越简单,误伤的可能就越小。
我用的分类表是这样的:图片放 Images,文档放 Documents,表格和演示文稿放 Documents,压缩包放 Archives,安装包放 Installers,其他类型先放 Others,不直接删除。这样即使分类不完美,文件也还在,只是换了一个位置。
核心代码
from pathlib import Path
import argparse, shutil
RULES = {
".jpg": "Images", ".png": "Images", ".pdf": "Documents",
".docx": "Documents", ".xlsx": "Documents", ".zip": "Archives",
".exe": "Installers", ".dmg": "Installers",
}
def unique_path(target: Path) -> Path:
if not target.exists():
return target
i = 1
while True:
new_name = f"{target.stem}_{i}{target.suffix}"
candidate = target.with_name(new_name)
if not candidate.exists():
return candidate
i += 1
def main():
parser = argparse.ArgumentParser(description="按类型整理文件夹")
parser.add_argument("source", help="要整理的目录")
parser.add_argument("--dry-run", action="store_true", help="只预览,不移动")
args = parser.parse_args()
source = Path(args.source).expanduser()
for item in source.iterdir():
if not item.is_file() or item.name.startswith("."):
continue
folder = RULES.get(item.suffix.lower(), "Others")
dest = unique_path(source / folder / item.name)
if args.dry_run:
print(f"{item.name} -> {folder}/")
else:
dest.parent.mkdir(parents=True, exist_ok=True)
shutil.move(str(item), str(dest))
if __name__ == "__main__":
main()
这里有几个值得注意的细节。第一,用 Path 而不是字符串拼接路径,跨平台更稳,也不用操心斜杠方向。第二,unique_path 在重名时自动加序号,避免新文件把旧文件覆盖掉。第三,隐藏文件直接跳过,防止误动系统或应用的配置文件。
先预览,再真正移动
批量移动文件最怕“手一抖”。所以 dry-run 是这个工具最重要的功能。先运行预览,确认每一行的去向都合理,再去掉参数真正执行。
python tidy.py ~/Downloads --dry-run
python tidy.py ~/Downloads
我还建议第一次只对一个专门的测试目录运行,里面放几个复制出来的文件。确认无误后,再用在真实的下载目录上。已经整理过的文件夹不要反复运行,因为脚本只处理源目录顶层的文件,不会递归进已经分好的子文件夹。
可以继续扩展的方向
这个骨架很容易扩展:如果分类表越来越长,可以把它抽到一个 JSON 配置文件里;如果想按日期再分一层,可以用文件的修改时间生成“年-月”子目录;如果经常忘记运行,可以用系统定时任务每周执行一次。扩展时保持一个原则:每加一个功能,就先想清楚它会不会误删或覆盖文件。
小工具的价值不在于代码多复杂,而在于规则清晰、可预览、可回退。先把下载文件夹的混乱收拾好,再把时间留给真正的工作,这就是它存在的意义。
- 点赞
- 收藏
- 关注作者
评论(0)