用 Path.samefile(other_path) 最可靠,它通过 inode(Unix/Linux/macOS)或卷序列号+文件索引(Windows)判断是否为同一文件实体,自动解析符号链接,要求路径存在。

用 pathlib 判断两个路径是否指向同一个真实文件,核心是使用 路径的规范绝对路径 + 文件系统 inode(或等价标识) 进行比对。单纯比较字符串路径不可靠(符号链接、相对路径、大小写、挂载点等都会导致误判)。
用 resolve() + samefile() 最可靠
Path.samefile(other_path) 是 pathlib 提供的专门方法,内部调用操作系统级的 os.path.samefile(),通过比较 inode(Unix/Linux/macOS)或 volume serial number + file index(Windows)来判断是否为同一文件实体。
- 它会自动处理符号链接:如果任一路径是符号链接,
samefile()会解析到目标文件再比对 - 要求两个路径都必须存在且可访问,否则抛出
FileNotFoundError - 推荐先用
resolve()确保路径合法,但samefile()内部已做类似工作,通常可直接调用
示例:
>>> from pathlib import Path>>> p1 = Path("docs/README.md")
>>> p2 = Path("./docs/../docs/README.md")
>>> p3 = Path("docs/README.md").resolve() # 绝对路径
>>> p4 = Path("link_to_readme").resolve() # 指向 README.md 的软链
>>> p1.samefile(p2)
True
>>> p1.samefile(p4)
True
注意 resolve() 本身不保证跨设备/挂载点一致
resolve() 能消除 .、..、符号链接,生成唯一的绝对路径,但它不能替代 samefile():
- 在某些网络文件系统或特殊挂载场景下,不同路径
resolve()后可能看起来一样,但实际指向不同文件(极少见,但存在) - Windows 上若路径含重解析点(如目录交接点),
resolve()行为与符号链接不同,samefile()仍能正确识别底层文件实体 - 所以不要只比
p1.resolve() == p2.resolve()—— 这只是必要非充分条件
安全使用 samefile() 的建议
- 先检查路径是否存在:
p1.exists() and p2.exists(),避免异常中断逻辑 - 若需容错,用 try/except 捕获
FileNotFoundError或OSError - 对用户输入或不确定路径,建议加
strict=False(Python 3.10+)让resolve()在中间路径不存在时不报错,但samefile()仍要求最终目标存在
不推荐的替代方式
以下方法均不可靠:
-
str(p1) == str(p2):忽略路径规范化,大小写、斜杠风格、相对性全影响结果 -
p1.resolve() == p2.resolve():无法识别硬链接(不同路径可指向同一 inode)、某些重解析点、NFS 边界问题 - 仅比文件名或大小或修改时间:完全不具备唯一性










