比较python中的两个路径

Jag*_* Ks 25 python path python-2.7

考虑,

path1 = "c:/fold1/fold2"
list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]

if path1 in list_of_paths:
    print "found"
Run Code Online (Sandbox Code Playgroud)

我希望if语句返回true但它的计算结果为False,因为它是字符串比较

如何比较两条路径,无论它有前向或后向斜线!我不喜欢使用替换功能并将两个字符串转换为comman格式

fal*_*tru 26

使用os.path.normpath转换c:/fold1/fold2c:\fold1\fold2:

>>> path1 = "c:/fold1/fold2"
>>> list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]
>>> os.path.normpath(path1)
'c:\\fold1\\fold2'
>>> os.path.normpath(path1) in list_of_paths
True
>>> os.path.normpath(path1) in (os.path.normpath(p) for p in list_of_paths)
True
Run Code Online (Sandbox Code Playgroud)
  • os.path.normpath(path1) in map(os.path.normpath, list_of_paths)也可以,但它会建立一个包含整个路径项的列表,即使中间有匹配.(在Python 2.x中)

在Windows上,必须使用os.path.normcase比较路径,因为在Windows上,路径不区分大小写.

  • 并添加os.path.normcase以在Windows上转换为小写 - 因为窗口应该不区分大小写进行比较. (7认同)
  • Windows 上仍然存在一个问题:'c:\\users\\administrator\\foo.txt' 与 'c:\\users\\admini~1\\foo.txt' 是同一个文件,这要归功于以下问题: 8.3 文件名。 (2认同)
  • 我认为你想使用`os.path.realpath`,来涵盖@cbare 提到的情况。 (2认同)

use*_*ica 12

os.path模块包含几个用于规范化文件路径的函数,以便等效路径规范化为相同的字符串.你可能想normpath,normcase,abspath,samefile,或其他一些工具.

  • +1 为 `os.path.samefile(path1, path2)`。使用此功能无需在执行字符串比较之前使用“normpath()”、“realpath()”或“normcase()”(在 Windows 操作系统上)。然而,它要求文件系统上存在两个路径,否则将引发“FileNotFoundError”异常,并且它不会解析主相对路径,例如“~/Path/To/File”,因为这些路径使用“expanduser()”。注意:Python 3.2 添加了对 Windows 操作系统的“samefile()”支持。 (3认同)

Jon*_*art 12

所有这些答案都提到了os.path.normpath,但没有一个提到os.path.realpath:

os.path.realpath(path)

返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果操作系统支持它们).

2.2版中的新功能.

那么:

if os.path.realpath(path1) in (os.path.realpath(p) for p in list_of_paths):
    # ...
Run Code Online (Sandbox Code Playgroud)


pko*_*zyk 7

如果您使用的是,则可以使用来实现您的目标:

import pathlib
path1 = pathlib.Path("c:/fold1/fold2")
list_of_paths = [pathlib.Path(path) for path in ["c:\\fold1\\fold2","c:\\temp\\temp123"]]
assert path1 in list_of_paths
Run Code Online (Sandbox Code Playgroud)