Я пытаюсь перевести мой код с использования os.path
на использование pathlib.Path
.
У меня есть функция, которая возвращает полный путь конкретный c родитель, которого я ищу по имени константы. Как уже говорилось, в настоящее время я использую os.path
и строки для путей, поэтому сейчас это делается с помощью регулярных выражений.
Я хочу, например, чтобы константа parent = d
могла получить:
/a/b/c/d/e --> /a/b/c/d
/a/b/c/d/e/f --> /a/b/c/d
/root/a/b/c/d/e --> /root/a/b/c/d
Примечание : как показывает пример, я не хочу полагаться на какую-либо фиксированную позицию с обеих сторон.
Я пробовал 2 способа, но оба чувствуют немного неуклюжий:
Используйте parts
, чтобы найти правильный parents
элемент:
>>> path = "/a/b/c/d/e/f"
>>> parts = Path(path).parts
>>> parent_index = len(parts) - 1 - parts.index('d') - 1
>>> Path(path).parents[parent_index]
PosixPath('/a/b/c/d')
Используйте parts
и объедините соответствующие:
>>> path = "/root/a/b/c/d/e"
>>> parts = Path(path).parts
>>> Path(*parts[:parts.index('d')+1])
PosixPath('/root/a/b/c/d')
Я бы сказал, что второй кажется разумным, но все же, мой вопрос: есть ли лучший способ добиться этого?
PS В случае, если часть не присутствует в пути, достаточно вызвать исключение или какой-либо индикатор (сейчас я оберните код с index
выше с try/except
).