Respuestas:
Use os.path.normpath, entonces os.path.basename:
>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
La primera elimina cualquier barra diagonal, la segunda le proporciona la última parte del camino. Usar solo basenameda todo después de la última barra, que en este caso es ''.
Podrías hacerlo
>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')
ACTUALIZACIÓN1: este enfoque funciona en caso de que le des /folderA/folderB/folderC/folderD/xx.py. Esto da xx.py como el nombre base. Que no es lo que quieres, supongo. Entonces podrías hacer esto ...
>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
dirname = os.path.basename(path)
ACTUALIZACIÓN2: Como señaló lars , realizar cambios para acomodar el final '/'.
>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Con python 3 puedes usar el pathlibmódulo ( pathlib.PurePathpor ejemplo):
>>> import pathlib
>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'
Si desea el último nombre de carpeta donde se encuentra un archivo:
>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'
Aquí está mi enfoque:
>>> 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
Estaba buscando una solución para obtener el último nombre de carpeta donde se encuentra el archivo, solo lo usé splitdos veces, para obtener la parte correcta. No es la pregunta, pero Google me transfirió aquí.
pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + " " + tail)
Una solución ingenua (Python 2.5.2+):
s="/path/to/any/folder/orfile"
desired_dir_or_file = s[s.rindex('/',0,-1)+1:-1] if s.endswith('/') else s[s.rindex('/')+1:]
Me gusta el método de partes de Path para esto:
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}')
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
os.pathmódulo.
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
folderD. nofolderC
os.pathmódulo.
rstrip('/')que sería más simple, pero luego me di cuenta rápidamente de que tenía que usarrstrip(os.path.sep), por lo que obviamente el uso denormpathestá justificado.