Reputation: 487
Consider:
path1 = "c:/fold1/fold2"
list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]
if path1 in list_of_paths:
print "found"
I would like the if statement to return True
, but it evaluates to False
,
since it is a string comparison.
How to compare two paths irrespective of the forward or backward slashes they have? I'd prefer not to use the replace
function to convert both strings to a common format.
Upvotes: 47
Views: 50135
Reputation: 1483
Simply use os.path.samefile(path1, path2)
.
https://docs.python.org/3/library/os.path.html#os.path.samefile
Upvotes: 2
Reputation: 18453
If you are using python-3, you can use pathlib to achieve your goal:
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
Upvotes: 9
Reputation: 368944
Use os.path.normpath
to convert c:/fold1/fold2
to 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)
also works, but it will build a list with entire path items even though there's match in the middle. (In Python 2.x)On Windows, you must use os.path.normcase
to compare paths because on Windows, paths are not case-sensitive.
Upvotes: 49
Reputation: 137398
All of these answers mention os.path.normpath
, but none of them mention os.path.realpath
:
os.path.realpath(path)
Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path (if they are supported by the operating system).
New in version 2.2.
So then:
if os.path.realpath(path1) in (os.path.realpath(p) for p in list_of_paths):
# ...
Upvotes: 25
Reputation: 280251
The os.path
module contains several functions to normalize file paths so that equivalent paths normalize to the same string. You may want normpath
, normcase
, abspath
, samefile
, or some other tool.
Upvotes: 22
Reputation: 154866
Use os.path.normpath
to canonicalize the paths before comparing them. For example:
if any(os.path.normpath(path1) == os.path.normpath(p)
for p in list_of_paths):
print "found"
Upvotes: 2
Reputation: 11070
Store the list_of_paths as a list instead of a string:
list_of_paths = [["c:","fold1","fold2"],["c","temp","temp123"]]
Then split given path by '/' or '\' (whichever is present) and then use the in
keyword.
Upvotes: 2