用pathlib遍历+shutil.move更稳:Path.iterdir()返回Path对象,支持is_file()、suffix等方法;跳过子目录和隐藏文件;用defaultdict(list)按小写后缀分组;移动前确保目标目录存在、避免覆盖、捕获异常;Windows需处理长路径和只读属性。

直接用 pathlib 遍历 + shutil.move 搬文件,比写一堆 os.path 判断更稳、更少出错。
用 pathlib.Path.iterdir() 安全遍历非递归文件
别用 os.listdir() —— 它返回纯字符串,没路径对象,后续判断类型、拼接路径都容易漏掉 / 或误判符号链接。而 Path.iterdir() 返回的是 Path 对象,自带 .is_file()、.suffix、.stem 等方法:
- 跳过子目录:只处理
.is_file() is True的条目 - 忽略隐藏文件(如
.DS_Store):加条件not p.name.startswith('.') -
.suffix.lower()统一小写,避免.JPG和.jpg被分到不同文件夹
按扩展名分组时,defaultdict(list) 比手动 if key in dict 更干净
你想把所有 .py、.md、.pdf 分别归类,但不确定会遇到哪些后缀。用 defaultdict(list) 可以省去每次检查键是否存在:
from collections import defaultdict
groups = defaultdict(list)
for p in Path("src_dir").iterdir():
if p.is_file() and not p.name.startswith('.'):
groups[p.suffix.lower()].append(p)
注意:p.suffix 包含点(如 '.py'),别误用 p.suffixes(那是针对 .tar.gz 这类多级后缀的)。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
立即学习“Python免费学习笔记(深入)”;
移动前必须检查目标目录是否存在,且不能覆盖同名文件
shutil.move() 不会自动创建父目录,也不提示覆盖 —— 一不小心就把两个 report.pdf 搞成一个被覆盖丢失。所以每步都要加防护:
- 用
target_dir.mkdir(exist_ok=True)确保分类文件夹存在 - 目标路径用
target_dir / p.name,别拼字符串 - 如果
(target_dir / p.name).exists(),建议跳过或改名(比如加_1),而不是强行覆盖 - 移动失败时捕获
shutil.Error或PermissionError,打印具体p.name方便排查
Windows 下注意长路径和只读文件
在 Windows 上,路径超 260 字符或源文件是只读的,shutil.move 会直接抛 WindowsError 或 OSError。临时解法:
- 启用长路径支持(注册表或组策略),或用
\?前缀(但pathlib默认不加,需手动处理) - 移动前加
p.chmod(0o644)清除只读属性(仅对本地文件有效) - 若涉及网络路径或 OneDrive 同步区,优先用
shutil.copy2()+p.unlink()替代move,控制力更强
实际跑起来最常卡住的不是逻辑,而是权限、路径长度、同名冲突这三点——先打日志,再动文件,比盲目批量操作靠谱得多。

















