Respostas:
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', '')
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ão split_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.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
vez de from os import path
?
from os import path
, o nome path
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 do os
namespace e onde quer que você faça a chamada, as pessoas sabem que é path()
do os
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.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
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!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
para garantir apenas o máximo de .tar.gz.
Uma opção pode ser dividir do ponto:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
Não há erro quando o arquivo não tem uma extensão:
>>> "filename".split(".")[-1]
'filename'
Mas você deve ter cuidado:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
"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.
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:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
in .splittext(filename)[1][1:]
) - obrigado antecipadamente
splittext()
(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 ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
mas deve ser: .tar.gz
As soluções possíveis estão aqui
gunzip somefile.tar.gz
qual é o nome do arquivo de saída?
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:
filepath.rpartition('.')[-1]
exemplo:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
lhe dará: 'csv'
("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")
.
Surpreendeu que isso ainda não tivesse sido mencionado:
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:
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
[-1]
então.
Você pode usar um 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
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
retorno, se o nome do arquivo não tiver nenhum .
. Isso ocorre porque rfind
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.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Outra solução com divisão correta:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
Mesmo esta 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'
\.[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
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Veja aqui o resultado: Clique Aqui
Este é o método mais simples para obter o nome do arquivo e a extensão em uma única linha .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
Ao contrário de outras soluções, você não precisa importar nenhum pacote para isso.
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.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
tente isto:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
é um nome de arquivo válido. O que acontece se eu jogar isso no seu código? Que tal .bashrc
ou foo
? Existe uma função de biblioteca para isso por uma razão ...
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
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
name_only=file_name[:filename.index(".")
Isso fornecerá o nome do arquivo até o primeiro ".", Que seria o mais comum.
file.name.ext
basename
é um pouco confuso aqui desdeos.path.basename("/path/to/somefile.ext")
voltaria"somefile.ext"