os.path.exists仅判断路径存在性而不区分类型,易致误用;推荐用pathlib.Path.is_dir()或os.path.isdir()精准判断目录,注意符号链接与权限影响。

os.path.exists 会把文件和文件夹一并返回 True
os.path.exists 只判断路径是否存在,不区分类型。如果你传入一个文件路径或文件夹路径,只要它真实存在,就都返回 True。这在需要明确“必须是文件夹”的场景下容易出错。
常见错误现象:用 os.path.exists 检查后直接调用 os.listdir,结果遇到同名文件时报 NotADirectoryError。
- 适用场景:只需要确认路径“有没有”,比如判断配置文件是否存在
- 不适用场景:创建子目录前校验父目录、递归遍历前跳过文件
- 若必须用它判断文件夹,请搭配
os.path.isdir一起用,例如:os.path.exists(path) and os.path.isdir(path)
Pathlib 的 is_dir() 更精准且可读性高
pathlib.Path 对象的 is_dir() 方法只在目标是**目录**时返回 True,遇到文件、软链接(非目录)、不存在路径都返回 False,语义清晰,不易误用。
示例:
from pathlib import Path
p = Path("/tmp/data")
if p.is_dir():
print("确实是文件夹,可以安全遍历")
- 注意:
p.is_dir()对不存在路径返回False,不会抛异常,不用先 try 或 exists 判断 - 兼容性:Python 3.4+ 原生支持,无需额外安装
- 性能差异微乎其微,日常使用无需顾虑
os.path.isdir 是更轻量的替代方案(适合老项目)
如果项目还不能升级到 Python 3.4+,或代码中已大量使用 os.path,直接改用 os.path.isdir 比套一层 exists + isdir 更简洁可靠。
-
os.path.isdir(path)自动处理路径不存在的情况,返回False,不抛OSError - 比
os.path.exists(path) and os.path.isdir(path)少一次系统调用,略快一点点 - 注意 Windows 下对末尾反斜杠敏感,建议统一用正斜杠或
os.path.normpath标准化
别忽略符号链接和权限问题
无论用哪种方法,is_dir() 和 os.path.isdir() 默认**不跟随符号链接**。如果路径是链接到目录的软链,默认返回 False(除非你显式用 is_dir(follow_symlinks=True))。
另一个易忽略点:即使路径存在且是目录,当前用户没有 x(执行)权限,在 Linux/macOS 下也会导致 is_dir() 返回 False —— 因为无法进入该目录做类型判定。
- 检查权限问题可用
os.access(path, os.X_OK) - 符号链接行为需根据业务决定是否跟随,不要默认假设
- CI/CD 环境或容器中常因挂载方式导致权限或链接解析异常,这类问题在现场难复现
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











