最直观的方式是用 pathlib.path 的 is_file()、is_dir()、is_symlink() 方法判断路径类型,但必须先用 exists() 检查路径存在性,否则不存在路径一律返回 false;windows 对符号链接支持有限,且不识别 .lnk 快捷方式。

用 pathlib 判断路径类型最直观
Python 3.4+ 推荐用 pathlib.Path,它把路径当对象处理,判断类型直接调方法,不用记一堆 os.path 函数名。只要路径存在,.is_file()、.is_dir()、.is_symlink() 都返回 True 或 False。
常见错误是没检查路径是否存在就调用这些方法——它们对不存在的路径一律返回 False,但不会报错,容易误判。
-
Path("/etc/passwd").is_file()→True -
Path("/tmp").is_dir()→True -
Path("/bin/sh").is_symlink()→ 多数系统下为True -
Path("/nonexistent").is_file()→False(不是报错,这点要特别注意)
用 os.path 时要注意函数行为差异
os.path.isfile()、os.path.isdir()、os.path.islink() 是传统方式,语义和 pathlib 一致,但有个关键区别:它们对符号链接默认“跟随”(即判断目标是否为文件/目录),而 os.path.islink() 只判断本身是不是链接。
比如 /usr/bin/python3 是个符号链接,指向 /usr/bin/python3.10:
-
os.path.isfile("/usr/bin/python3")→True(因为它指向一个文件) -
os.path.islink("/usr/bin/python3")→True(它本身是链接) -
os.path.isdir("/usr/bin/python3")→False
如果你需要“不跟随链接”的判断(比如只看链接本身是不是目录),就得用 pathlib 的 .is_dir() 或 os.stat() + stat.S_ISDIR()。
判断前必须先确认路径存在
无论是 pathlib 还是 os.path,所有 is_* 方法对不存在的路径都返回 False,无法区分“是文件但被删了”和“根本不是文件”。所以实际代码里得加一层存在性检查:
from pathlib import Path
p = Path("/some/path")
if not p.exists():
print("路径不存在")
elif p.is_file():
print("是文件")
elif p.is_dir():
print("是目录")
elif p.is_symlink():
print("是符号链接")
注意:p.exists() 对符号链接会跟随判断目标是否存在;如果只想确认链接本身存在(不管目标有没有),要用 p.is_symlink() or p.exists() 配合 lstat 级操作,但多数场景不需要这么细。
Windows 下符号链接支持有限
Windows 默认不启用符号链接,普通用户创建 os.symlink() 会失败(需要管理员权限或开启开发者模式)。所以 .is_symlink() 在 Windows 上可能永远返回 False,除非明确配置过环境。
更麻烦的是,Windows 有“快捷方式(.lnk)”和“NTFS 符号链接”两种机制,pathlib 和 os.path 只识别后者,对 .lnk 文件完全无感——它既不是文件也不是目录更不是链接,.is_file() 会返回 True(因为 .lnk 本身是普通文件)。
跨平台脚本如果真要处理 Windows 快捷方式,得额外用 win32com 或解析二进制头,这不是 is_symlink() 能覆盖的范围。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











