leitura - manipulação de dados python




Extraindo extensão do nome de arquivo em Python (14)

Existe uma função para extrair a extensão de um nome de arquivo?


Apenas join todos os pathlib suffixes .

>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'

Com splitext há problemas com arquivos com extensão dupla (por exemplo, file.tar.bz2 , file.tar.bz2 , etc.)

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

mas deve ser: .tar.gz

As possíveis soluções estão here


Essa é uma técnica direta de representação de string: eu vejo muitas soluções mencionadas, mas acho que a maioria está olhando para split. Split, no entanto, faz isso em todas as ocorrências de "." . O que você preferiria estar procurando é partição.

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]

Mesmo essa pergunta já foi respondida eu adicionaria a solução no Regex.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'

Qualquer uma das soluções acima funciona, mas no linux eu descobri que há uma nova linha no final da string de extensão que impedirá que as correspondências sejam bem-sucedidas. Adicione o método strip() ao final. Por exemplo:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

Surpreendido isso não foi mencionado ainda:

import os
fn = '/some/path/a.tar.gz'

basename = os.path.basename(fn)  # os independent
Out[] a.tar.gz

base = basename.split('.')[0]
Out[] a

ext = '.'.join(basename.split('.')[1:])   # <-- main part

# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz

Benefícios:

  • Funciona como esperado para qualquer coisa que eu possa pensar
  • Sem módulos
  • Sem regex
  • Plataforma cruzada
  • Facilmente extensível (por exemplo, sem pontos principais para extensão, apenas a última parte da extensão)

Como função:

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None

Você pode encontrar ótimas coisas no módulo pathlib.

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'

Você pode usar uma split em um filename :

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

Isso não requer biblioteca adicional


Novo na versão 3.4.

import pathlib

print(pathlib.Path('yourPathGoesHere').suffix)

Estou surpreso que ninguém mencionou o pathlib ainda, o pathlib é incrível!

Se você precisar de todos os sufixos (por exemplo, se você tiver um .tar.gz ), os .suffixes retornarão uma lista deles!


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 cadeia, os.path.splitext tratará corretamente /a/bc/d como não tendo extensão em vez de ter extensão .c/d , e tratará .bashrc como não tendo nenhuma 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', '')

def NewFileName(fichier):
    cpt = 0
    fic , *ext =  fichier.split('.')
    ext = '.'.join(ext)
    while os.path.isfile(fichier):
        cpt += 1
        fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
    return fichier

import os.path
extension = os.path.splitext(filename)[1]

filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]

name_only=file_name[:filename.index(".")

Isso lhe dará o nome do arquivo até o primeiro ".", Que seria o mais comum.





file-extension