请考虑:
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
函数将两个字符串转换为通用格式。
请考虑:
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
函数将两个字符串转换为通用格式。
使用os.path.normpath
将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.path.normpath(path1) in map(os.path.normpath, list_of_paths)
也可以工作,但它会构建一个包含整个路径项的列表,即使在中间有匹配项。(在Python 2.x 中)在Windows上,您必须使用os.path.normcase
来比较路径,因为在Windows上,路径不区分大小写。
所有这些答案都提到了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):
# ...
os.path
模块包含多个函数,用于规范化文件路径,以便等效路径归一化为相同的字符串。你可能需要使用 normpath
、normcase
、abspath
、samefile
或其他工具。
os.path.samefile(path1, path2)
命令可以避免在执行字符串比较之前使用 normpath()
、realpath()
或者(在 Windows 操作系统上)normcase()
。但是,需要确保两个路径都存在于文件系统中,否则会引发 FileNotFoundError
异常。此外,该命令不能解析主目录相对路径,例如 ~/Path/To/File
,如果需要解析这种路径,请使用 expanduser()
。请注意:Python 3.2 版本已经为 Windows 操作系统添加了 samefile()
支持。 - mattstPath('..').resolve() in [Path('.').resolve().parent]
,这通常是 True
,除非没有更多的父级。 - notfancy将list_of_paths存储为列表而不是字符串:
list_of_paths = [["c:","fold1","fold2"],["c","temp","temp123"]]
然后,通过“/”或“\”(无论哪个存在)来拆分给定路径,然后使用in
关键字。
在比较路径之前,请使用os.path.normpath
来规范化路径。例如:
if any(os.path.normpath(path1) == os.path.normpath(p)
for p in list_of_paths):
print "found"
normpath
满足此要求。当然,OP 两年半前可能错误陈述了他们的要求,但那只是猜测。 - user4815162342os.path.samefile(path1, path2)
即可。
https://docs.python.org/3/library/os.path.html#os.path.samefile
lis3
->list3
,x\y
->x\\y
,x\y\z
->x\\y\\z
)并创建目录a\b\c
,x\y\z
后,它对我有效(打印“found”)。 - falsetruos.path.realpath
,以覆盖像@cbare提到的情况。 - Jonathon Reinhart