Как получить только имя родительского каталога, а не полный путь? - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь получить только имя родительского каталога. Значение, только его последний компонент, а не полный путь.

Так, например, для пути a/b/c/d/e Я хочу получить d, а не a/b/c/d.

Мой текущий код:

import os

path = "C:/example/folder/file1.jpg"
directoryName = os.path.dirname(os.path.normpath(path)) 
print(directoryName)

Это печатает C:/example/folder и я хочу получить folder.

Ответы [ 5 ]

4 голосов
/ 02 апреля 2020

Самый простой способ сделать это - использовать pathlib. Использование parent даст вам полный путь родителя, а name даст вам только последний компонент:

>>> from pathlib import Path
>>> path = Path("/a/b/c/d/e")
>>> path.parent.name
'd'

Для сравнения , чтобы сделать то же самое с os.path, вам необходимо получить basename из dirname вашего пути. Так что это переводится прямо в:

import os

path = "C:/example/folder/file1.jpg"
print(os.path.basename(os.path.dirname(path)))

Какая версия лучше:

os.path.split(os.path.split(path)[0])[1]

Где оба дают:

'folder'

Как видите, pathlib подход гораздо понятнее и читабельнее. Поскольку pathlib включает в себя подход OOP для представления путей, вместо строк мы получаем четкую цепочку вызовов атрибутов / методов.

path.parent.name

Читается в следующем порядке:

начать с пути -> взять его родителя -> взять его имя

В то время как в подходе os functions-accept-strings вам действительно нужно читать изнутри!

os.path.basename(os.path.dirname(path))

Читается в следующем порядке:

Имя родителя пути

С чем, я уверен, вы согласитесь, гораздо сложнее читать и понимать (и это просто пример).


Вы также можете использовать метод str.split вместе с os.sep:

>>> path = "C:\\example\\folder\\file1.jpg"
>>> path.split(os.sep)[-2]
'folder'

Но в качестве состояния документов:

Обратите внимание, что знание этого [(разделителя)] недостаточно для анализа или объединения путей - используйте os.path.split () и os.path.join () - но это иногда полезно.

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

Используйте pathlib.Path, чтобы получить .name из .parent:

from pathlib import Path

p = Path("C:/example/folder/file1.jpg")
print(p.parent.name)  # folder

По сравнению с os.path, pathlib представляет пути в виде отдельного типа вместо строк. Обычно он короче и удобнее в использовании.

0 голосов
/ 02 апреля 2020

Простое решение с использованием pathlib

0. Путь импорта из pathlib

from pathlib import Path
path = "C:/example/folder/file1.jpg"

1. Получить родительский уровень 1

parent_lv1 = Path(path).parent

2. Получить родительский уровень 2

parent_lv2 = parent_lv1.parent

3. Получить ближайшего родителя

imm_parent = parent_lv1.relative_to(parent_lv2)
print(imm_parent)
0 голосов
/ 02 апреля 2020

это работает

path = "C:/example/folder/file1.jpg"
directoryName = os.path.dirname(path) 
parent = directoryName.split("/")
parent.reverse()
print(parent[0])


0 голосов
/ 02 апреля 2020

Я предпочитаю регулярное выражение

import re

def get_parent(path: str) -> str:
    match = re.search(r".*[\\|/](\w+)[\\|/].*", path)
    if match:
        return match.group(1)
    else:
        return ""



if __name__ == '__main__':
    my_path = "/home/tony/some/cool/path"
    print(get_parent(my_path))
    win_path = r"C:\windows\path\has\dumb\backslashes"
    print(get_parent(win_path))

Вывод

cool
dumb
...