比较python中的两条路径

比较python中的两条路径,python,python-2.7,path,python-3,pathlib,Python,Python 2.7,Path,Python 3,Pathlib,考虑: path1 = "c:/fold1/fold2" list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"] if path1 in list_of_paths: print "found" 我希望if语句返回True,但其计算结果为False, 因为它是一个字符串比较 如何比较两条路径,而不考虑它们的前斜杠或后斜杠?我不希望使用replace函数将两个字符串转换为通用格式。将路径列表存储为列表而不是字符串: list_o

考虑:

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

if path1 in list_of_paths:
    print "found"
我希望if语句返回
True
,但其计算结果为
False
, 因为它是一个字符串比较


如何比较两条路径,而不考虑它们的前斜杠或后斜杠?我不希望使用
replace
函数将两个字符串转换为通用格式。

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

list_of_paths = [["c:","fold1","fold2"],["c","temp","temp123"]]
然后用“/”或“\”分割给定路径(以存在的为准),然后使用关键字中的

用于将
c:/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.Posial.OrthPalm(PATH1)在map(OS.Posi.NoalPoad,ListSoof OpTrand)中也可以工作,但是它将构建一个带有整个路径项的列表,即使中间有匹配。(在Python2.x中)

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

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

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

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

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

os.path.realpath(路径)

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

版本2.2中的新功能

那么:

if os.path.realpath(path1) in (os.path.realpath(p) for p in list_of_paths):
    # ...
如果您正在使用,您可以使用来实现您的目标:

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

嗨,Ashwin,我不确定哪个变量有什么斜杠,因为这两个变量都是动态生成的,我不能替换每个字符串,因为我将浏览大数据,并在windows上添加os.path.normcase以转换为小写-因为windows应该不区分大小写进行比较。但OP说任何一个变量都可能有斜杠place@AswinMurugesh,谢谢你的评论。我添加了一个可以处理这种情况的版本。list1=['a\\b\\c','x\y\z'],list2=['a\\b','x\y'],lis3=[os.path.normpath(item)表示列表1中的项,如果os.path.isdir(item)],list4=[os.path.normpath(item)表示列表2中的项,如果os.path.isdir(item)]对于列表4中的目录:对于root,dirnames,os.walk(目录)中的文件名:如果列表3中的os.path.normpath(root):打印“found”,但此代码以某种方式失败!我想您应该使用
os.path.realpath
,以涵盖诸如@cbare references.os.path.normpath之类的情况。normpath用于规范化路径,我们应该使用os.path.realpath进行规范化。@baky这取决于具体的要求。因为OP请求比较“不考虑正斜杠或反斜杠”,这
normpath
满足了这一要求。当然,OP可能在两年半前错误地陈述了他们的需求,但这只是猜测。
os.path.samefile(path1,path2)
的+1。使用此选项,无需在执行字符串比较之前使用
normpath()
realpath()
normcase()
(在Windows操作系统上)。但是,它要求文件系统上同时存在这两个路径,否则将引发
FileNotFoundError
异常,并且它不会解析这些用法的主相对路径,例如
~/Path/to/File
。注意:Python 3.2添加了对Windows操作系统的
samefile()
支持。+1也支持samefile,只是要提一下:尽管名称“samefile”也允许检查目录!看见