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.