pathlib.path.glob()比os.listdir()+字符串匹配更可靠,因其天然处理路径分隔符、通配符语义和符号链接,返回path对象支持.is_file()、.suffix等方法,避免字符串解析错误,且rglob()支持递归,而glob()默认仅当前目录。

pathlib.Path.glob() 为什么比 os.listdir() + 字符串匹配更可靠
直接用 glob() 能天然处理路径分隔符、通配符语义和符号链接遍历逻辑,避免手动拼接 os.path.join() 或误判 "*.py" 是否该匹配隐藏文件。它返回的是 Path 对象,后续调用 .is_file()、.suffix 等方法无需再做字符串解析。
常见错误是写成 Path("src").glob("*.py") 却忘了递归——这只会查当前层;需要深层过滤时得用 rglob()。
- 匹配所有 Python 文件(含子目录):
Path("src").rglob("*.py") - 排除
__pycache__目录:需额外过滤,glob()本身不支持排除模式 - 注意 Windows 下大小写不敏感,但 Linux/macOS 默认敏感——
"*.PY"在 Linux 不会匹配main.py
如何用 path.is_file() 和 path.suffix 过滤出真正要处理的文件
glob() 和 rglob() 返回的是所有匹配项,包括可能存在的同名目录(比如叫 test.py 的文件夹)。不加判断直接 open() 会报 IsADirectoryError。
必须显式检查 .is_file(),不能只靠后缀。同时,.suffix 比 .name.endswith(".py") 更准确——它只取最后一个点之后的部分,不会把 archive.tar.gz 误判为 .gz 文件。
- 安全过滤 Python 文件:
list(Path("src").rglob("*.py"))→ 再用[p for p in paths if p.is_file() and p.suffix == ".py"] -
.stem可取无后缀文件名,.parent可快速获取所在目录,避免字符串切分 - 如果只需文件名不含路径,别用
str(p).split("/")[-1],直接用p.name
filter() 配合 lambda 写法 vs 列表推导式,哪种更易读且不易漏判
用 filter(lambda p: p.is_file(), ...) 看似函数式,但嵌套多条件时可读性骤降,而且返回迭代器,容易被意外消费一次就空了。列表推导式在 pathlib 场景中更直观、可控。
尤其要注意:Path 对象的布尔值永远为 True(即使路径不存在),所以 if p: 不能代替 if p.exists() 或 if p.is_file()。
- 推荐写法:
[p for p in Path("logs").rglob("*") if p.is_file() and p.stat().st_size > 1024] - 避免写
filter(lambda p: p.is_file() and ".log" in p.name, ...)——".log"子串匹配可能误中app.log.bak或目录名 - 若需大小写无关匹配,用
p.suffix.lower() == ".py",别用.name.lower().endswith()
性能差异:glob() vs walk() + 手动匹配,什么场景下必须换
对小项目(rglob() 和 os.walk() 差距不大;但当目标模式稀疏(比如只找顶层 README.md),rglob() 仍会遍历全部子目录,而 walk() 可在某层 break 提前退出。
另一个硬伤是 glob() 不支持正则,遇到 "config-*.yaml" 还行,但要匹配 "config-v[0-9]+.yaml" 就得回退到 re.match() 配合 iterdir()。
- 纯前缀/后缀/通配:优先
rglob() - 需跳过特定目录(如
node_modules):用os.walk()手动控制dirs[:] = [d for d in dirs if d != "node_modules"] - 路径存在性不确定时,
Path(...).exists()比try/except FileNotFoundError开销略大,但更清晰
最常被忽略的是 Path 对象缓存行为:多次调用 p.stat() 不会重复系统调用,但 p.exists() 和 p.is_file() 各自触发独立 stat,必要时先存 st = p.stat() 再判断 st.st_mode。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











