In python, suppose I have a path like this:
/folderA/folderB/folderC/folderD/
How can I get just the folderD
part?
In python, suppose I have a path like this:
/folderA/folderB/folderC/folderD/
How can I get just the folderD
part?
Use os.path.normpath
to strip off any trailing slashes, then os.path.basename
gives you the last part of the path:
>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Using only basename
gives everything after the last slash, which in this case is ''
.
rstrip('/')
would be simpler but then quickly realised I'd have to use rstrip(os.path.sep)
, so obviously the use of normpath
is justified. –
Ken '\\\\?\\D:\\A\\B\\C\\'
and '\\\\?\\UNC\\svr\\B\\C\\'
(returns an empty string) This solution works for all cases. –
Imidazole str.strip
around it, too, because based on input, you might have whitespaces, but that might just be me –
Airel With python 3 you can use the pathlib
module (pathlib.PurePath
for example):
>>> import pathlib
>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'
If you want the last folder name where a file is located:
>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'
PurePath
vs Path
, the first provides "purely computational operations" (no I/O), while the other ("concrete path") inherits from the first but also provides I/O operations. –
Alberich You could do
>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')
UPDATE1: This approach works in case you give it /folderA/folderB/folderC/folderD/xx.py. This gives xx.py as the basename. Which is not what you want I guess. So you could do this -
>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
dirname = os.path.basename(path)
UPDATE2: As lars pointed out, making changes so as to accomodate trailing '/'.
>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Here is my approach:
>>> import os
>>> print os.path.basename(
os.path.dirname('/folderA/folderB/folderC/folderD/test.py'))
folderD
>>> print os.path.basename(
os.path.dirname('/folderA/folderB/folderC/folderD/'))
folderD
>>> print os.path.basename(
os.path.dirname('/folderA/folderB/folderC/folderD'))
folderC
/
(and without needing purepath) –
Marketa I was searching for a solution to get the last foldername where the file is located, I just used split
two times, to get the right part. It's not the question but google transfered me here.
pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + " " + tail)
os.path.basename(os.path.dirname(pathname))
which would give folderD
in your example. See answer from @Mike Miterer –
Marketa If you use the native python package pathlib it's really simple.
>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/")
>>> your_path.stem
'folderD'
Suppose you have the path to a file in folderD.
>>> from pathlib import Path
>>> your_path = Path("/folderA/folderB/folderC/folderD/file.txt")
>>> your_path.name
'file.txt'
>>> your_path.parent.name
'folderD'
stem
will only return file
not file.txt
. If you want file.txt
you need your_path.name
. Pathlib Docs –
Industrialize I like the parts method of Path for this:
grandparent_directory, parent_directory, filename = Path(export_filename).parts[-3:]
log.info(f'{t: <30}: {num_rows: >7} Rows exported to {grandparent_directory}/{parent_directory}/{filename}')
'/'.join(Path(export_filename).parts[-3:])
–
Tadich During my current projects, I'm often passing rear parts of a path to a function and therefore use the Path
module. To get the n-th part in reverse order, I'm using:
from typing import Union
from pathlib import Path
def get_single_subpath_part(base_dir: Union[Path, str], n:int) -> str:
if n ==0:
return Path(base_dir).name
for _ in range(n):
base_dir = Path(base_dir).parent
return getattr(base_dir, "name")
path= "/folderA/folderB/folderC/folderD/"
# for getting the last part:
print(get_single_subpath_part(path, 0))
# yields "folderD"
# for the second last
print(get_single_subpath_part(path, 1))
#yields "folderC"
Furthermore, to pass the n-th part in reverse order of a path containing the remaining path, I use:
from typing import Union
from pathlib import Path
def get_n_last_subparts_path(base_dir: Union[Path, str], n:int) -> Path:
return Path(*Path(base_dir).parts[-n-1:])
path= "/folderA/folderB/folderC/folderD/"
# for getting the last part:
print(get_n_last_subparts_path(path, 0))
# yields a `Path` object of "folderD"
# for second last and last part together
print(get_n_last_subparts_path(path, 1))
# yields a `Path` object of "folderc/folderD"
Note that this function returns a Path
object which can easily be converted to a string (e.g. str(path)
)
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
os.path
module. –
Brilliantine str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
folderD
. not folderC
–
Woodchopper os.path
module. –
Brilliantine © 2022 - 2024 — McMap. All rights reserved.