比较python中的两个路径

时间:2014-01-16 10:04:20

标签: python python-2.7 path

考虑,

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

if path1 in list_of_paths:
    print "found"

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

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

6 个答案:

答案 0 :(得分:21)

使用os.path.normpathc:/fold1/fold2转换为c:\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
  • os.path.normpath(path1) in map(os.path.normpath, list_of_paths)也可以,但它会构建一个包含完整路径项的列表,即使中间有匹配项。 (在Python 2.x中)

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

答案 1 :(得分:11)

所有这些答案都提到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):
    # ...

答案 2 :(得分:10)

os.path模块包含几个用于规范化文件路径的函数,以便等效路径规范化为相同的字符串。您可能需要normpathnormcaseabspathsamefile或其他工具。

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

将list_of_paths存储为列表而不是字符串:

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

然后按'/'或'\'分割给定路径(以存在的为准),然后使用in关键字。

答案 5 :(得分:2)

在比较路径之前,使用os.path.normpath规范化路径。例如:

if any(os.path.normpath(path1) == os.path.normpath(p)
       for p in list_of_paths):
    print "found"