用pathlib.path.rglob配合collections.counter统计文件后缀最简洁可靠:先rglob("*")遍历所有路径,再is_file()过滤,suffix.lower()提取后缀(空则设为"no_extension"),最后counter聚合并most_common输出。

直接用 pathlib 遍历 + collections.Counter 统计后缀,5 行代码搞定,比 os.walk 更简洁、比 glob 更可控。
用 pathlib.Path.rglob 扫描所有文件
这是最轻量又可靠的方式:它天然跳过目录(只返回 Path 对象),支持通配符,且跨平台行为一致。别用 os.listdir 手动递归——容易漏子目录或误判符号链接。
常见错误是写成 Path("dir").iterdir(),这只扫一层;或者用 glob("**/*") 但没加 recursive=True,结果为空。
实操建议:
- 始终用
Path("your_dir").rglob("*"),再用.is_file()过滤 - 避免
**/*.py这类写法——它会漏掉无后缀文件(如README) - 如果要排除某些目录(如
.git),加个if ".git" not in str(p)判断就行
用 pathlib.Path.suffix 提取后缀,注意空字符串情况
.suffix 返回最后一个点后的部分,比如 "a.tar.gz" → ".gz";而 .suffixes 是列表 [".tar", ".gz"]。统计“类型”通常指最终扩展名,所以用 .suffix 更合理。
容易踩的坑:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
Path("Makefile").suffix是空字符串"",不是".mk"—— 它没点,得单独归为"no_extension" -
Path("archive.tar.gz").suffix是".gz",不是".tar.gz";若需完整多级后缀,得自己拼"".join(p.suffixes) - 大小写混杂(
.JPGvs.jpg)会影响统计结果,建议统一转小写
用 Counter 聚合,比字典手动累加更稳
手动写 count[ext] = count.get(ext, 0) + 1 容易错,尤其遇到 None 或不可哈希类型时。而 Counter 天然支持任意可哈希键,还带 .most_common() 快速排 top N。
示例代码片段:
from collections import Counter
from pathlib import Path
p = Path("src")
exts = [p.suffix.lower() or "no_extension" for p in p.rglob("*") if p.is_file()]
counter = Counter(exts)
print(counter.most_common(5))
性能提示:对百万级小文件,rglob 比 os.walk 略慢一点(因构造大量 Path 对象),但代码清晰度和可维护性高得多;真卡顿再换 os.scandir。
处理隐藏文件、符号链接和权限错误
默认 rglob 会包含 .gitignore 这类隐藏文件,也尝试遍历符号链接目标——如果目标不存在或没权限,会抛 PermissionError 或 FileNotFoundError。
安全做法是捕获异常并跳过:
- 用
try/except包住p.is_file()判断,而不是提前过滤路径 - 不主动调用
p.resolve(),避免触发符号链接解析失败 - 若需严格排除隐藏文件,加条件
not p.name.startswith(".")
真正麻烦的是网络文件系统或挂载点异常——这时 rglob 可能卡住几秒,建议加超时包装或改用单层扫描+队列迭代。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










