¿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?

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


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'

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'

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

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)

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:]

¿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}')


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.