Existe uma função embutida no Python que iria substituir (ou remover, qualquer que seja) a extensão de um nome de arquivo (se houver)?
Exemplo:
print replace_extension('/home/user/somefile.txt', '.jpg')
No meu exemplo: /home/user/somefile.txt
seria/home/user/somefile.jpg
Não sei se isso importa, mas preciso disso para um módulo SCons que estou escrevendo. (Então, talvez haja alguma função específica do SCons que eu possa usar?)
Eu gostaria de algo limpo . Fazer uma simples substituição de string de todas as ocorrências de .txt
dentro da string obviamente não está limpo. (Isso iria falhar se meu nome de arquivo for somefile.txt.txt.txt
)
Respostas:
Tente os.path.splitext, ele deve fazer o que você quiser.
fonte
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
retornará/home/user/somefile/.jpg
, o que não é desejável.Expandindo a resposta de AnaPana, como remover uma extensão usando pathlib (Python> = 3.4):
fonte
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
irá imprimir'data/foo.tar.jpg'
. Suponho que você pode fazerpth.with_suffix('').with_suffix('.jpg')
, mas é desajeitado, e você precisaria adicionar uma cadeia de.with_suffix('')
chamadas arbitrariamente longa para lidar com um número arbitrário de pontos.
em uma extensão de arquivo (reconhecidamente, mais de 2 é um caso exótico).while
loop para resolver isso:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Como @jethro disse,
splitext
é a maneira legal de fazer isso. Mas, neste caso, é muito fácil dividir você mesmo, já que a extensão deve ser a parte do nome do arquivo que vem após o ponto final:O
rsplit
diz ao Python para realizar as divisões da string começando da direita da string e o1
diz para realizar no máximo uma divisão (de modo que, por exemplo,'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Comorsplit
sempre retornará um array não vazio, podemos indexar0
nele com segurança para obter o nome do arquivo sem a extensão.fonte
rsplit
resultará em resultados diferentes para arquivos que começam com um ponto e não têm outra extensão (como arquivos ocultos no Linux, por exemplo.bashrc
).os.path.splitext
retorna uma extensão vazia para estes, mas usarrsplit
tratará todo o nome do arquivo como uma extensão./home/john.johnson/somefile
Eu prefiro a seguinte abordagem de uma linha usando str.rsplit () :
Exemplo:
fonte
Para Python> = 3.4:
fonte
Tratamento de múltiplas extensões
No caso em que você tem várias extensões, este one-liner usa
pathlib
estr.replace
funciona muito bem:Remover / remover extensões
Substituir extensões
Se você também quiser uma
pathlib
saída de objeto, você pode, obviamente, quebrar a linhaPath()
Resumindo tudo em uma função
fonte
with_suffix
vez dereplace
removeria apenas em.gz
vez de.tar.gz
Minha resposta deveria ser "geral", mas se você esperasse apenas uma única extensão,with_suffix
seria uma solução mais limpa.Outra maneira de fazer é usar o
str.rpartition(sep)
método.Por exemplo:
fonte