Come ottenere solo l'ultima parte di un percorso in Python?


233

In Python, supponiamo di avere un percorso come questo:

/folderA/folderB/folderC/folderD/

Come posso ottenere solo la folderDparte?

Risposte:


389

Usa os.path.normpath, quindi os.path.basename:

>>> os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

Il primo elimina eventuali barre finali, il secondo fornisce l'ultima parte del percorso. L'uso basenamedà solo tutto dopo l'ultima barra, che in questo caso è ''.


1
Inizialmente ho pensato che rstrip('/')sarebbe stato più semplice, ma poi ho capito rapidamente che avrei dovuto usare rstrip(os.path.sep), quindi ovviamente l'uso di normpathè giustificato.
— Erik Kaplun,

Questo non sembra funzionare su percorsi lunghi di Windows, ad esempio, '\\\\?\\D:\\A\\B\\C\\'e '\\\\?\\UNC\\svr\\B\\C\\'(restituisce una stringa vuota) Questa soluzione funziona per tutti i casi.
— omasoud

26

Si potrebbe fare

>>> import os
>>> os.path.basename('/folderA/folderB/folderC/folderD')

AGGIORNAMENTO1: questo approccio funziona nel caso in cui tu lo dia /folderA/folderB/folderC/folderD/xx.py. Questo dà xx.py come basename. Non è quello che vuoi, immagino. Quindi potresti farlo -

>>> import os
>>> path = "/folderA/folderB/folderC/folderD"
>>> if os.path.isdir(path):
        dirname = os.path.basename(path)

AGGIORNAMENTO2: Come sottolineato da Lars , apportare modifiche in modo da soddisfare il "/" finale.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'

In Python-think, os.path.basename ("... /") produce correttamente ''. Sì, anch'io lo trovo non ottimale. Il ... basename (... normpath ... soluzione di seguito è però canonico.
— Cameron Laird

@lars yeah! ho appena visto che in quel caso normalizza il percorso prima di dargli il nome di base. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
— Srikar Appalaraju

UPDATE2 è l'approccio migliore che ho trovato finora.
— Akki,

23

Con python 3 puoi usare il pathlibmodulo ( pathlib.PurePathper esempio):

>>> import pathlib

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/')
>>> path.name
'folderD'

Se si desidera l'ultimo nome della cartella in cui si trova un file:

>>> path = pathlib.PurePath('/folderA/folderB/folderC/folderD/file.py')
>>> path.parent.name
'folderD'

18

Ecco il mio approccio:

>>> 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
Cosa risolve il tuo approccio in modo diverso / migliore di quanto sopra?
— user1767754

9

Stavo cercando una soluzione per ottenere l'ultimo foldername in cui si trova il file, ho usato solo splitdue volte, per ottenere la parte giusta. Non è la domanda, ma Google mi ha trasferito qui.

pathname = "/folderA/folderB/folderC/folderD/filename.py"
head, tail = os.path.split(os.path.split(pathname)[0])
print(head + "   "  + tail)

2

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

perché qualcuno dovrebbe usarlo?
— Chris_Rands

1

Mi piace il metodo delle parti di Path per questo:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.