Existe uma função para extrair a extensão de um nome de arquivo?
1301
Existe uma função para extrair a extensão de um nome de arquivo?
Sim. Use os.path.splitext
(consulte a documentação do Python 2.X ou a documentação do Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Ao contrário da maioria das tentativas manuais de divisão de cadeias, os.path.splitext
tratará corretamente /a/b.c/d
como sem extensão em vez de ter extensão .c/d
, e tratará .bashrc
como sem extensão em vez de ter extensão .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
é um pouco confuso aqui desdeos.path.basename("/path/to/somefile.ext")
voltaria"somefile.ext"
endswith()
não ser mais portátil e pythônico?.asd
é realmente a extensão !! Se você pensar bem,foo.tar.gz
é um arquivo compactado com gzip (.gz
) que passa a ser um arquivo tar (.tar
). Mas é um arquivo gzip em primeiro lugar. Eu não esperaria que ele retornasse a extensão dupla.splittext
. Se eles fizessem alguma coisa para significar a quebra entre partes desse nome, seria muito mais fácil reconhecer que ésplitExt
ou nãosplit_ext
. Certamente não posso ser a única pessoa que cometeu esse erro?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Sinta-se à vontade para fornecer um exemplo de contador real sem fazer referência a alguma biblioteca de terceiros.fonte
import os.path
vez defrom os import path
?from os import path
, o nomepath
será usado no seu escopo local, também outros que olham o código podem não saber imediatamente que caminho é o caminho do módulo OS. Onde você usa,import os.path
ele o mantém dentro doos
namespace e onde quer que você faça a chamada, as pessoas sabem que épath()
doos
módulo imediatamente._, extension = os.path.splitext(filename)
muito mais bonita.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Novo na versão 3.4.
Estou surpreso que ninguém tenha mencionado
pathlib
ainda,pathlib
É incrível!Se você precisar de todos os sufixos (por exemplo, se você tiver um
.tar.gz
),.suffixes
retornará uma lista deles!fonte
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
para garantir apenas o máximo de .tar.gz.Para obter apenas o texto da extensão, sem o ponto.
fonte
Uma opção pode ser dividir do ponto:
Não há erro quando o arquivo não tem uma extensão:
Mas você deve ter cuidado:
fonte
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
com'file.tar.gz'.split('.')
vs['file.tar', 'gz']
com'file.tar.gz'.rsplit('.', 1)
. sim, poderia ser.vale a pena adicionar um mais baixo para que você não se pergunte por que os JPG não estão aparecendo na sua lista.
fonte
Qualquer uma das soluções acima funciona, mas no linux eu descobri que há uma nova linha no final da cadeia de extensão que impedirá que as correspondências tenham êxito. Adicione o
strip()
método ao final. Por exemplo:fonte
[1:]
in.splittext(filename)[1][1:]
) - obrigado antecipadamentesplittext()
(diferente de se você dividir uma string usando '.') Inclui o '.' caractere na extensão. O adicional[1:]
se livra disso.Com splitext há problemas com arquivos com extensão dupla (por exemplo
file.tar.gz
,file.tar.bz2
, etc ..)mas deve ser:
.tar.gz
As soluções possíveis estão aqui
fonte
gunzip somefile.tar.gz
qual é o nome do arquivo de saída?Você pode encontrar ótimas coisas no módulo pathlib (disponível no python 3.x).
fonte
Embora seja um tópico antigo, mas eu me pergunto por que não há ninguém mencionando uma API muito simples de python chamada rpartition neste caso:
Para obter a extensão de um determinado caminho absoluto do arquivo, basta digitar:
exemplo:
lhe dará: 'csv'
fonte
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Se não houver nenhum separador encontrado, a tupla retornada será:("", "", "the original string")
.Apenas
join
tudopathlib suffixes
.fonte
Surpreendeu que isso ainda não tivesse sido mencionado:
Benefícios:
Como função:
fonte
[-1]
então.Você pode usar um
split
em umfilename
:Isso não requer biblioteca adicional
fonte
fonte
filename
retorno, se o nome do arquivo não tiver nenhum.
. Isso ocorre porquerfind
retorna-1
se a sequência não for encontrada.Esta é uma técnica direta de representação de cadeias: vejo muitas soluções mencionadas, mas acho que a maioria está olhando para a divisão. Split, no entanto, faz isso em todas as ocorrências de "." . O que você preferiria procurar é partição.
fonte
Outra solução com divisão correta:
fonte
Mesmo esta pergunta já foi respondida, eu adicionaria a solução no Regex.
fonte
\.[0-9a-z]+$
como neste post .Um verdadeiro one-liner, se você gosta de regex. E isso não importa, mesmo se você tiver "." no meio
Veja aqui o resultado: Clique Aqui
fonte
Este é o método mais simples para obter o nome do arquivo e a extensão em uma única linha .
Ao contrário de outras soluções, você não precisa importar nenhum pacote para isso.
fonte
Para brincadeiras ... basta coletar as extensões em um ditado e acompanhar todas elas em uma pasta. Em seguida, basta puxar as extensões que você deseja.
fonte
tente isto:
fonte
foo.tar
é um nome de arquivo válido. O que acontece se eu jogar isso no seu código? Que tal.bashrc
oufoo
? Existe uma função de biblioteca para isso por uma razão ...fonte
fonte
Isso fornecerá o nome do arquivo até o primeiro ".", Que seria o mais comum.
fonte
file.name.ext