Python中检查绝对路径

10
如何在Python中检查两个文件路径是否指向同一个文件?
5个回答

26
$ 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

很好的回答。我不知道这个方法! - jkp
3
请注意,文档只记录了此功能在Unix上可用。它在Windows上不可用,至少在Python 2.6中是如此。 - Weeble
2
对于Windows系统,您可以使用os.stat('foo') == os.stat('bar')来近似实现此行为。 - wim
注意:这仅在文件实际存在时才有效。当它们是假设的(例如,在复制文件之前检查目标位置是否已存在),使用abspath比较是正确的方法。 - Thomas

6
你想使用 os.path.abspath(path) 来规范化每个路径以进行比较。
os.path.abspath(foo) == os.path.abspath(bar)

3
一个简单的字符串比较就可以解决问题:
import os
print os.path.abspath(first) == os.path.abspath(second)

感谢Andrew指出错误,我的初始帖子包含对os.path.normpath的调用,这是不必要的,因为os.path.abspath的实现已经为您执行了这个操作。


1
你不需要先调用 normpath - Andrew Hare
1
Andrew:如果你只是要比较字符串,有些情况下你可能会得到指向同一文件的不同路径。os.abspath并不聪明,它只会添加一个前缀。 - jkp
@Andrew:不好意思,我撤回之前的说法了!你是对的,至少在*nix上,实现会自动为你做这件事。每天都是一个学习的日子 :) - jkp
我不同意,来自http://docs.python.org/library/os.path.html: 返回路径名path的规范化的绝对版本。在大多数平台上,这相当于normpath(join(os.getcwd(), path))。 - Andrew Hare

0
在Windows系统上,没有samefile函数,并且您还需要担心大小写问题。可以将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或挂载的网络共享来创建指向同一文件的多个不同路径,则这些解决方案都无法说"那是同一个文件"。希望大多数时候这不是太大的问题。


0

在Windows上,也许可以使用os.path.relpath(path1,path2)作为os.path.samefile(path1,path2)的解决方法?

如果os.path.relpath(path1,path2)返回'.',则path1和path2指向同一位置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接