user10026373
user10026373

Reputation:

How do I get the parent directory's name only, not full path?

I am trying to get the parent directory's name only. Meaning, only its last component, not the full path.

So for example for the path a/b/c/d/e I want to get d, and not a/b/c/d.

My current code:

import os

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

This prints out C:/example/folder and I want to get just folder.

Upvotes: 4

Views: 5686

Answers (5)

Tomerikoo
Tomerikoo

Reputation: 19430

The simplest way to do this would be using pathlib. Using parent will get you the parent's full path, and name will give you just the last component:

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

For comparison, to do the same with os.path, you will need to get the basename of the dirname of your path. So that translates directly to:

import os

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

Which is the nicer version of:

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

Where both give:

'folder'

As you can see, the pathlib approach is much clearer and readable. Because pathlib incorporates the OOP approach for representing paths, instead of strings, we get a clear chain of attributes/method calls.

path.parent.name

Is read in order as:

start from path -> take its parent -> take its name

Whereas in the os functions-accepting-strings approach you actually need to read from inside-out!

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

Is read in order as:

The name of the parent of the path

Which I'm sure you'll agree is much harder to read and understand (and this is just a simple-case example).


You could also use the str.split method together with os.sep:

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

But as the docs state:

Note that knowing this [(the separator)] is not sufficient to be able to parse or concatenate pathnames — use os.path.split() and os.path.join() — but it is occasionally useful.

Upvotes: 13

MisterMiyagi
MisterMiyagi

Reputation: 52169

Use pathlib.Path to get the .name of the .parent:

from pathlib import Path

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

Compared to os.path, pathlib represents paths as a separate type instead of strings. It generally is shorter and more convenient to use.

Upvotes: 5

Diogo Duarte
Diogo Duarte

Reputation: 41

Simple to solve using pathlib

0. Import Path from pathlib

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

1. Get parent level 1

parent_lv1 = Path(path).parent

2. Get parent level 2

parent_lv2 = parent_lv1.parent

3. Get immediate parent

imm_parent = parent_lv1.relative_to(parent_lv2)
print(imm_parent)

Upvotes: 0

Yash Mistry
Yash Mistry

Reputation: 47

this works

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


Upvotes: 0

marketzero
marketzero

Reputation: 1

I prefer regex

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))

Output

cool
dumb

Upvotes: -1

Related Questions