Como obter o nome do arquivo sem a extensão de um caminho no Python?
995
Obtendo o nome do arquivo sem a extensão:
import os
print(os.path.splitext("/path/to/some/file.txt")[0])
Impressões:
/path/to/some/file
Documentação paraos.path.splitext
.
Nota importante: Se o nome do arquivo tiver vários pontos, somente a extensão após a última será removida. Por exemplo:
import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])
Impressões:
/path/to/some/file.txt.zip
Veja outras respostas abaixo se precisar lidar com esse caso.
splitext('kitty.jpg.zip')
é('kitty.jpg', '.zip')
).splitext(basename('/some/path/to/file.txt'))[0]
(que eu sempre parecem estar fazendo)Você pode fazer o seu próprio com:
Nota importante: Se houver mais de um
.
no nome do arquivo, somente o último será removido. Por exemplo:Veja abaixo outras respostas que abordam isso.
fonte
os
.Usando
pathlib
em Python 3.4 ou superiorretornará
fonte
os.path
soluções, isso removerá apenas um ramal (ousuffix
, como épathlib
chamado).Path('a.b.c').stem == 'a.b'
Path(Path('a.b.c').stem).stem
.with_suffix('')
é o caminho a percorrer. Você provavelmente gostaria de fazer um loop atép.suffix == ''
.fonte
`
para mostrar o código e "/somepath/hermanth.txt" como uma instância de caminho.os.path.basename
não é necessário.os.path.basename
deve ser usado apenas para obter o nome do arquivo no caminho do arquivo.No Python 3.4+, você pode usar a
pathlib
soluçãofonte
resolve()
segue o caminho? É realmente possível obter um caminho para um arquivo e não fazer com que o nome do arquivo faça parte do caminho sem isso? Isso significa que, se você der um caminho para o link simbólico, retornará o nome do arquivo (sem a extensão) do arquivo para o qual o link simbólico aponta.resolve()
é ajudar a lidar com o problema de vários pontos. A resposta abaixo sobre o uso do índice não funcionará se o caminho for './foo.tar.gz'https://docs.python.org/3/library/os.path.html
No python 3 pathlib "O módulo pathlib oferece objetos de caminho de alto nível." tão,
fonte
Se você deseja manter o caminho para o arquivo e apenas remover a extensão
fonte
'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
os.path.splitext () não funcionará se houver vários pontos na extensão.
Por exemplo, images.tar.gz
Você pode apenas encontrar o índice do primeiro ponto no nome da base e depois dividi-lo para obter apenas o nome do arquivo sem extensão.
fonte
.tar.gz
.tar.bz
.tar.7z
'haystack'.index('needle')
lança uma exceção ValueError se a agulha (no caso acima, o ponto.
) não for encontrada no palheiro. Arquivos sem qualquer extensão também existem.@ IceAdor's refere-se ao rsplit em um comentário à solução do @ user2902201. O rsplit é a solução mais simples que suporta múltiplos períodos.
Aqui está explicitado:
meu relatório
fonte
import os
e, em seguida, useos.path.basename
import
ingos
não significa que você pode usaros.foo
sem se referir aos
.fonte
from os import foo
.os
módulo se ele tiver um membro chamadofoo
.path
, considere ouwalk
).Pensei em incluir uma variação no uso do os.path.splitext sem a necessidade de usar a indexação de array.
A função sempre retorna um
(root, ext)
par, portanto é seguro usar:root, ext = os.path.splitext(path)
Exemplo:
fonte
Os outros métodos não removem várias extensões. Alguns também têm problemas com nomes de arquivos que não têm extensões. Esse trecho trata das instâncias e funciona no Python 2 e 3. Ele pega o nome da base do caminho, divide o valor em pontos e retorna o primeiro, que é a parte inicial do nome do arquivo.
Aqui está um conjunto de exemplos para executar:
Em todos os casos, o valor impresso é:
fonte
Path('/path/to/file.txt').stem
. (1,23μs vs 8,39μs)import os
Isso retorna
filename
semextension
(C: \ Usuários \ Público \ Vídeos \ Vídeos de exemplo \ vida selvagem)Agora você pode obter apenas a
filename
partir da temperatura comfonte
Um procedimento com reconhecimento de várias extensões. Trabalhos para
str
eunicode
caminhos. Funciona em Python 2 e 3.Comportamento:
fonte
fonte
No sistema Windows, usei também o prefixo drivername, como:
Portanto, como não preciso da letra da unidade ou do nome do diretório, uso:
fonte
Por conveniência, uma função simples envolvendo os dois métodos de
os.path
:Testado com Python 3.5.
fonte
a maneira mais fácil de resolver isso é
isso economiza tempo e custos de computação.
fonte
Muito muito muito simpely nenhum outro módulo !!!
fonte
Poderíamos fazer algumas coisas simples
split
/pop
mágicas, como visto aqui ( https://stackoverflow.com/a/424006/1250044 ), para extrair o nome do arquivo (respeitando as diferenças de janelas e POSIX).fonte
fonte
importar o nome do arquivo, extensão_do_arquivo = os.path.splitext ('/ d1 / d2 / exemplo.cs') o nome do arquivo é '/ d1 / d2 / exemplo' a extensão do arquivo é '.cs'
fonte