Como obter apenas a última parte de um caminho em Python?

233

No Python, suponha que eu tenha um caminho como este:

/folderA/folderB/folderC/folderD/

Como posso obter apenas a folderDparte?

pepero
fonte

Respostas:

389

Use os.path.normpath, então os.path.basename:

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

A primeira retira qualquer barra à direita, a segunda fornece a última parte do caminho. Usar apenas basenamefornece tudo após a última barra, que neste caso é ''.

Fred Foo
fonte
1
Inicialmente, pensei rstrip('/')que seria mais simples, mas logo percebi que teria que usar rstrip(os.path.sep), portanto, obviamente, o uso de normpathé justificado.
precisa
Isso não parece funcionar nos caminhos longos do Windows, por exemplo, '\\\\?\\D:\\A\\B\\C\\'e '\\\\?\\UNC\\svr\\B\\C\\'(retorna uma string vazia). Esta solução funciona para todos os casos.
omasoud
25

Você poderia fazer

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

UPDATE1: Essa abordagem funciona caso você a /folderA/folderB/folderC/folderD/xx.py. Isso fornece xx.py como o nome da base. O que não é o que você quer, eu acho. Então você poderia fazer isso -

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

UPDATE2: Como Lars apontou, fazer alterações para acomodar o '/' à direita.

>>> from os.path import normpath, basename
>>> basename(normpath('/folderA/folderB/folderC/folderD/'))
'folderD'
Srikar Appalaraju
fonte
No Python-think, os.path.basename ("... /") produz corretamente ''. Sim, eu também acho isso subótimo. A ... basename (... normpath ... a solução abaixo é canônica, no entanto.
Cameron Laird
@lars yeah! vi que, nesse caso, normalize o caminho primeiro antes de alimentá-lo com o nome da base. os.path.basename (os.path.normpath ('/ folderA / folderB / folderC / folderD /'))
Srikar Appalaraju
UPDATE2 é a melhor abordagem que encontrei até agora.
28615 akki
23

Com o python 3, você pode usar o pathlibmódulo ( pathlib.PurePathpor exemplo):

>>> import pathlib

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

Se você deseja o último nome da pasta em que um arquivo está localizado:

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

Aqui está a minha abordagem:

>>> 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
fonte
1
O que sua abordagem resolve diferente / melhor do que o mencionado acima?
user1767754
9

Eu estava procurando uma solução para obter o último nome da pasta onde o arquivo está localizado, usei apenas splitduas vezes, para obter a parte certa. Não é a questão, mas o Google me transferiu para cá.

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

Uma solução ingênua (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
fonte
por que alguém usaria isso?
Chris_Rands
1

Eu gosto do método de partes do Path para isso:

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
fonte
0
path = "/folderA/folderB/folderC/folderD/"
last = path.split('/').pop()
GSto
fonte
10
Sério, use o os.pathmódulo.
QuIT - Anony-Mousse
0
str = "/folderA/folderB/folderC/folderD/"
print str.split("/")[-2]
Andrew Sledge
fonte
ele quer folderD. nãofolderC
Srikar Appalaraju 13/10/10
1
Ele fornece "folderD" porque a barra final faz com que o item final da lista seja ""
neil
21
Sério, use o os.pathmódulo.
Saiu - Anony-Mousse