Usar os.path.split
ou os.path.basename
como outros sugerem não funcionará em todos os casos: se você estiver executando o script no Linux e tentar processar um caminho clássico no estilo Windows, ele falhará.
Os caminhos do Windows podem usar barra invertida ou barra invertida como separador de caminho. Portanto, o ntpath
módulo (que é equivalente ao os.path ao executar no Windows) funcionará para todos os (1) caminhos em todas as plataformas.
import ntpath
ntpath.basename("a/b/c")
Obviamente, se o arquivo terminar com uma barra, o nome da base ficará vazio; portanto, faça sua própria função para lidar com isso:
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) Há uma ressalva: os nomes de arquivos do Linux podem conter barras invertidas . Portanto, no linux, r'a/b\c'
sempre se refere ao arquivo b\c
na a
pasta, enquanto no Windows, sempre se refere ao c
arquivo na b
subpasta da a
pasta. Portanto, quando ambas as barras são usadas em um caminho, você precisa conhecer a plataforma associada para poder interpretá-la corretamente. Na prática, geralmente é seguro assumir que é um caminho do Windows, já que as barras invertidas raramente são usadas nos nomes de arquivos do Linux, mas lembre-se disso quando você codificar para não criar falhas acidentais na segurança.
os.path
basta carregar ontpath
módulo internamente. Usando este módulo, é possível manipular os'\\'
separadores de caminho mesmo em máquinas Linux. Para Linux, oposixpath
módulo (resp.os.path
) Simplificará as operações do caminho para permitir apenas'/'
separadores de estilo posix .r'C:\path\to\file.txt'
) em uma máquina Linux, precisará usar o módulo ntpath. Caso contrário, você pode usar as funções do os.path. Isso ocorre porque os sistemas Linux normalmente permitem o uso dos caracteres de barra invertida nos nomes de arquivos (conforme explicado na resposta).os.path.basename(os.path.normpath(path))
?Na verdade, há uma função que retorna exatamente o que você deseja
fonte
os.path.basename(your_path)
Isso funcionou! Eu queria caminho do script:os.path.dirname(os.path.realpath(__file__))
eo nome do script:os.path.basename(os.path.realpath(__file__))
. Obrigado!'C:\\temp\\bla.txt'
.os.path.split é a função que você está procurando
fonte
Em python 3
fonte
cauda é o que você quer, o nome do arquivo.
Veja os documentos do módulo OS do python para obter detalhes
fonte
fonte
No seu exemplo, você também precisará remover a barra do lado direito para retornar
c
:Segundo nível:
atualização: acho
lazyr
que forneceu a resposta certa. Meu código não funcionará com caminhos semelhantes a janelas em sistemas unix e vice-versa com caminhos semelhantes a unix em sistemas Windows.fonte
r"a\b\c"
no linux, nem"a/b/c"
no windows.os.path.basename(path)
só funcionará seos.path.isfile(path)
forTrue
. Portanto,path = 'a/b/c/'
não é um nome de arquivo válido ...os.path.basename("a/b/c/")
retorna""
devido à barra final.lazyr
você está certo! Eu não pensei sobre isso. Seria seguro apenas fazerpath = path.replace('\\', '/')
?isso retornará: paint.exe
fonte
fname = str(path).split('/')[-1]
Se você deseja obter o nome do arquivo automaticamente, pode fazer
fonte
Se o caminho do arquivo não terminar com "/" e os diretórios separados por "/", use o código a seguir. Como sabemos, geralmente o caminho não termina com "/".
Mas, em alguns casos, como os URLs terminam com "/", use o seguinte código
mas quando seu caminho é marcado por "\", que você geralmente encontra nos caminhos do Windows, pode usar os seguintes códigos
Você pode combinar as duas em uma função, verificando o tipo de SO e retornando o resultado.
fonte
Isso funciona para linux e windows, bem como para a biblioteca padrão
Resultados:
fonte
Aqui está uma solução somente regex, que parece funcionar com qualquer caminho do sistema operacional em qualquer sistema operacional.
Nenhum outro módulo é necessário e também não é necessário pré-processamento:
Atualizar:
Se você quiser apenas uma potencial filename, se presente (ou seja,
/a/b/
é um dir e assim éc:\windows\
), altere o regex para:r'[^\\/]+(?![\\/])$'
. Para o "regex contestado", isso altera a aparência positiva positiva de algum tipo de barra para uma negativa negativa, fazendo com que os nomes de caminho que terminam com a barra não retornem nada, em vez do último subdiretório do nome do caminho. Obviamente, não há garantia de que o nome do arquivo em potencial se refira a um arquivo e, para isso,os.path.is_dir()
ouos.path.is_file()
precise ser empregado.Isso corresponderá da seguinte forma:
O regex pode ser testado aqui .
fonte
Talvez apenas a minha solução completa sem importantes novidades (considere o tempfile para criar arquivos temporários: D)
Obter os valores de
abc.name
será uma sequência como esta:'/tmp/tmpks5oksk7'
Para que eu possa substituir o/
por um espaço.replace("/", " ")
e depois chamarsplit()
. Isso retornará uma lista e eu recebo o último elemento da lista com[-1]
Não é necessário importar nenhum módulo.
fonte
Nunca vi caminhos com barra invertida dupla, eles existem? O recurso interno do módulo python
os
falha para eles. Todos os outros funcionam, também a ressalva dada por você comos.path.normpath()
:fonte
O separador do Windows pode estar em um nome de arquivo Unix ou em Caminho do Windows. O separador Unix pode existir apenas no caminho Unix. A presença de um separador Unix indica um caminho que não é do Windows.
A seguir, o separador específico do sistema operacional será separado (separador de corte cortado), depois será dividido e retornará o valor mais à direita. É feio, mas simples, com base no pressuposto acima. Se a suposição estiver incorreta, atualize e eu atualizarei esta resposta para atender às condições mais precisas.
Código de amostra:
fonte
Para completar, aqui está a
pathlib
solução para o python 3.2+:Isso funciona no Windows e Linux.
fonte
No Python 2 e 3, usando o módulo pathlib2 :
Uso:
Com sua caixa de teste:
A idéia aqui é converter todos os caminhos na representação interna unificada de
pathlib2
, com diferentes decodificadores, dependendo da plataforma. Felizmente,pathlib2
inclui um decodificador genérico chamadoPurePath
que deve funcionar em qualquer caminho. Caso isso não funcione, você pode forçar o reconhecimento do caminho do Windows usandofromwinpath=True
. Isso dividirá a sequência de entrada em partes, a última é a folha que você está procurando, daí apath2unix(t)[-1]
.Se o argumento
nojoin=False
, o caminho será juntado novamente, de forma que a saída seja simplesmente a sequência de entrada convertida para um formato Unix, que pode ser útil para comparar subcaminhos entre plataformas.fonte