【问题标题】:Check absolute paths in Python检查 Python 中的绝对路径
【发布时间】:2026-01-09 13:15:02
【问题描述】:

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

【问题讨论】:

    标签: python path


    【解决方案1】:
    $ 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
    

    【讨论】:

    • 不错的答案。我不知道这种方法!
    • 请注意,这被记录为仅在 Unix 上可用。它在 Windows 上不存在,至少在 Python 2.6 中不存在。
    • 对于windows,你可以用os.stat('foo') == os.stat('bar')来近似行为
    • 注意:这似乎只在文件实际存在时才有效。如果它们是假设的(例如,在复制文件之前检查目标目的地是否已经存在),那么绝对路径比较是他们的路要走。
    【解决方案2】:

    您想使用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 的实现会为您完成。

      【讨论】:

      • 您无需先致电normpath
      • Andrew:如果您只是要比较字符串,在某些情况下,您可能会得到指向同一个文件的不同路径。 os.abspath 没有做任何聪明的事情,它只是添加了一个前缀。
      • @Andrew:不,我收回!你是对的,对于 *nix 来说,至少实现是为你做的。每天都是上学日:)
      • 我不同意,来自docs.python.org/library/os.path.html:返回路径名路径的规范化绝对版本。在大多数平台上,这等价于 normpath(join(os.getcwd(), path))。
      【解决方案4】:

      在 Windows 系统上,没有samefile 功能,您还必须担心大小写。来自os.pathnormcase 函数可以与abspath 组合来处理这种情况。

      from os.path import abspath, normcase
      
      def are_paths_equivalent(path1, path2):
          return normcase(abspath(path1)) == normcase(abspath(path2))
      

      这将认为“C:\SPAM\Eggs.txt”等同于 Windows 上的“c:\spam\eggs.txt”。

      请注意,与samefile 不同,所有基于规范化和比较路径的方法都不会意识到完全不同的路径引用同一文件的情况。在 Windows 上,这意味着如果您使用 SUBST、MKLINK 或挂载的网络共享来为同一个文件创建多个不同的路径,这些解决方案都不能说“这是同一个文件”。希望大多数时候这不是什么大问题。

      【讨论】:

        【解决方案5】:

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

        如果 os.path.relpath(path1, path2) 返回 '.'比 path1 和 path2 指向同一个地方

        【讨论】: