Que biblioteca Python posso usar para extrair nomes de arquivos de caminhos, não importa qual seja o sistema operacional ou o formato do caminho?
Por exemplo, I'gostaria que todos estes caminhos me devolvessem c
:
a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c
Utilizando os.path.split
ou os.path.basename
como outros sugerem won'não funciona em todos os casos: se você'estiver rodando o script no Linux e tentar processar um caminho clássico no estilo windows, ele falhará.
Os caminhos do Windows podem usar a barra invertida ou a barra oblíqua para frente como separador de caminhos. Portanto, o módulo ntpath
(que é equivalente a os.path quando executado no Windows) irá funcionar para all(1) caminhos em todas as plataformas.
import ntpath
ntpath.basename("a/b/c")
Claro que, se o arquivo terminar com uma barra, o nome base estará vazio, então faça sua própria função para lidar com ele:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verificação:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Aí's uma ressalva: os nomes dos arquivos Linux podem conter barras invertidas. Então no linux, r'a/b\c'
sempre se refere ao arquivo b\c
na pasta a
, enquanto no Windows, sempre se refere ao arquivo c
na subpasta b
da pasta a
. Assim, quando tanto cortes para frente como para trás são utilizados num caminho, você necessária para conhecer a plataforma associada para ser capaz de interpretar corretamente. Na prática, ele's normalmente é seguro assumir que ele's é um caminho do windows já que as barras invertidas são raramente utilizadas em nomes de arquivos Linux, mas tenha isto em mente quando você codificar para que você não'não crie buracos de segurança acidentais.
os.path.split é a função que você está procurando
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d