Получение указанного c родителя пути по имени - PullRequest
2 голосов
/ 03 апреля 2020

Я пытаюсь перевести мой код с использования 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 способа, но оба чувствуют немного неуклюжий:

  1. Используйте 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')
    
  2. Используйте 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).

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Вместо этого вы можете использовать while l oop, чтобы продолжать поиск в обратном направлении для родительского элемента данного имени:

path = Path("/a/b/c/d/e/f")
while path.name != 'd':
    path = path.parent
    assert path.name, 'No parent found with the given name'
print(path)

Это выводит:

/a/b/c/d
0 голосов
/ 03 апреля 2020

Вы можете разделить и присоединить свою строку и использовать индекс элемента + 1

path='/a/b/c/d/e/f'
lpath=path.split('/')
index=lpath.index('d')+1
'/'.join(lpath[0:index])

вывод:

'/a/b/c/d'
...