如何在Python中检查两个文件路径是否指向同一个文件?
$ touch foo
$ ln -s foo bar
$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> help(os.path.samefile)
Help on function samefile in module posixpath:
samefile(f1, f2)
Test whether two pathnames reference the same actual file
>>> os.path.samefile("foo", "bar")
True
import os
print os.path.abspath(first) == os.path.abspath(second)
感谢Andrew指出错误,我的初始帖子包含对os.path.normpath
的调用,这是不必要的,因为os.path.abspath
的实现已经为您执行了这个操作。
normpath
。 - Andrew Haresamefile
函数,并且您还需要担心大小写问题。可以将os.path
中的normcase
函数与abspath
结合使用来处理此情况。from os.path import abspath, normcase
def are_paths_equivalent(path1, path2):
return normcase(abspath(path1)) == normcase(abspath(path2))
在Windows上,这将把"C:\SPAM\Eggs.txt"视为与"c:\spam\eggs.txt"等效。
请注意,与samefile
不同,基于规范化和比较路径的所有方法都不会意识到完全不同的路径引用相同的文件的情况。在Windows上,这意味着如果您使用SUBST、MKLINK或挂载的网络共享来创建指向同一文件的多个不同路径,则这些解决方案都无法说"那是同一个文件"。希望大多数时候这不是太大的问题。
在Windows上,也许可以使用os.path.relpath(path1,path2)作为os.path.samefile(path1,path2)的解决方法?
如果os.path.relpath(path1,path2)返回'.',则path1和path2指向同一位置
os.stat('foo') == os.stat('bar')
来近似实现此行为。 - wim