検討してください:
path1 = "c:/fold1/fold2"
list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]
if path1 in list_of_paths:
print "found"
IfステートメントがTrue
を返すことを望みますが、これは文字列比較であるため、False
に評価されます。
スラッシュに関係なく、2つのパスを比較するにはどうすればよいですか?両方の文字列を共通の形式に変換するために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では、パスを比較するためにmust_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
、またはその他のツールが必要になる場合があります。
文字列ではなくリストとして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"