Risposte:
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 basename
dà solo tutto dopo l'ultima barra, che in questo caso è ''
.
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'
Con python 3 puoi usare il pathlib
modulo ( pathlib.PurePath
per 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'
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
Stavo cercando una soluzione per ottenere l'ultimo foldername in cui si trova il file, ho usato solo split
due 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)
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:]
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}')
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
os.path
modulo.
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
folderD
. nofolderC
os.path
modulo.
rstrip('/')
sarebbe stato più semplice, ma poi ho capito rapidamente che avrei dovuto usarerstrip(os.path.sep)
, quindi ovviamente l'uso dinormpath
è giustificato.