¿Cómo obtener solo la última parte de una ruta en Python?

233

En Python, supongamos que tengo una ruta como esta:

/folderA/folderB/folderC/folderD/

¿Cómo puedo obtener solo la folderDparte?

pepero
fuente

Respuestas:

389

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 ''.

Fred Foo
fuente
1
Inicialmente pensé rstrip('/')que sería más simple, pero luego me di cuenta rápidamente de que tenía que usar rstrip(os.path.sep), por lo que obviamente el uso de normpathestá justificado.
Erik Kaplun
Esto no parece funcionar en las rutas largas de Windows, por ejemplo, '\\\\?\\D:\\A\\B\\C\\'y '\\\\?\\UNC\\svr\\B\\C\\'(devuelve una cadena vacía) Esta solución funciona para todos los casos.
omasoud
26

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'
Srikar Appalaraju
fuente
En Python-think, os.path.basename ("... /") produce correctamente ''. Sí, yo también encuentro eso subóptimo. El ... nombre base (... norma ... solución a continuación es canónica, sin embargo.)
Cameron Laird
@lars sí! Acabo de ver que en ese caso normaliza el camino primero antes de alimentarlo a basename. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju
UPDATE2 es el mejor enfoque que he encontrado hasta ahora.
akki
23

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'
jinnlao
fuente
18

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
Mike Mitterer
fuente
1
¿Qué resuelve su enfoque diferente / mejor que el mencionado?
user1767754
9

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)
usuario1767754
fuente
2

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:]
mshsayem
fuente
¿Por qué alguien usaría esto?
Chris_Rands
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}')
Andrew Magerman
fuente
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
fuente
10
En serio, usa el os.pathmódulo.
HA SALIDO - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
fuente
El quiere folderD. nofolderC
Srikar Appalaraju
1
Da "carpeta FolderD" porque la barra final hace que el elemento final de la lista sea ""
Neil
21
En serio, usa el os.pathmódulo.
HA SALIDO - Anony-Mousse