2014-01-16 4 views
10

считают,Сравнивая два пути в питона

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

if path1 in list_of_paths: 
    print "found" 

Я ожидаю, что если заявление возвращает истину, но она имеет значение ложного , так как это сравнение строк

как сравнить два пути, независимо от вперед или обратной косой черты в нем есть ! я не предпочитаю использовать функцию замены и преобразовать как строку в Comman формате

ответ

15

Использование 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, пути не чувствительны к регистру.

+4

И добавьте os.path.normcase, чтобы преобразовать в нижний регистр в окна - поскольку окна должны быть нечувствительны к регистру для сравнения. – ondra

+0

Но ОП говорит, что в любом месте может быть любая косая черта –

+0

@AswinMurugesh, Спасибо за комментарий. Я добавил версию, которая будет обрабатывать такой случай. – falsetru

1

Магазин в list_of_paths в виде списка вместо строки:

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

Затем разделить заданный путь, «/» или «\» (в зависимости от того, что присутствует), а затем используйте ключевое слово in.

+0

Привет Ashwin, я не уверен, какая переменная имеет то, что слэш, как оба они генерируются динамически, и я не могу заменить каждую строку, поскольку я бы занимался серфингом больших данных. –

+0

@JagannathKs: Как насчет отредактированного? –

1

Используйте os.path.normpath для канонизации дорожек перед их сопоставлением. Например:

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

os.path.normpath предназначен для нормализации путей, мы должны использовать os.path.realpath для канонизации. – baky

+0

@baky Это зависит от конкретных требований. Поскольку ОП запросило сравнение «независимо от перемотки вперед или назад», который выполняет «нормальный путь». Конечно, возможно, что ОП ошибочно утвердило свои требования два с половиной года назад, но это было бы угадать. – user4815162342

8

Модуль os.path содержит несколько функций, чтобы нормализовать пути к файлам так, что эквивалентные пути нормализации в ту же строку. Вы можете захотеть normpath, normcase, abspath, samefile или какой-либо другой инструмент.

2

Все эти ответы уже 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): 
    # ... 
1

Если вы используете , вы можете использовать для достижения своей цели:

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 
Смежные вопросы