Como posso verificar a extensão de um arquivo?

178

Estou trabalhando em um determinado programa em que preciso fazer coisas diferentes, dependendo da extensão do arquivo. Eu poderia apenas usar isso?

if m == *.mp3
   ...
elif m == *.flac
   ...
wkoomson
fonte
módulo uso pitão re (regex) para correspondência
kefeizhou
21
@kefeizhou: Oh, Deus, não, não para partidas simples.
orlp 5/05

Respostas:

383

Supondo que mseja uma string, você pode usar endswith:

if m.endswith('.mp3'):
...
elif m.endswith('.flac'):
...

Para fazer distinção entre maiúsculas e minúsculas e eliminar uma cadeia potencialmente grande de outra coisa se:

m.lower().endswith(('.png', '.jpg', '.jpeg'))
Lafras
fonte
2
ext = partição m ('.') [- 1]; se ext == será muito mais eficiente
vulcão
1
@WilhelmMurdoch eu quase não vi seu comentário, ainda bem que vi.
Flaudre
@ vulcano porque não usar .split('.')[-1]? Ou a partição é realmente alta eficiência?
Scott Anderson
55

os.pathfornece muitas funções para manipular caminhos / nomes de arquivos. ( docs )

os.path.splitext segue um caminho e divide a extensão do arquivo do final.

import os

filepaths = ["/folder/soundfile.mp3", "folder1/folder/soundfile.flac"]

for fp in filepaths:
    # Split the extension from the path and normalise it to lowercase.
    ext = os.path.splitext(fp)[-1].lower()

    # Now we can simply use == to check for equality, no need for wildcards.
    if ext == ".mp3":
        print fp, "is an mp3!"
    elif ext == ".flac":
        print fp, "is a flac file!"
    else:
        print fp, "is an unknown file format."

Dá:

/folder/soundfile.mp3 é um mp3!
folder1 / folder / soundfile.flac é um arquivo flac!
Bolota
fonte
Este método ignora os períodos iniciais, portanto, /.mp3não é considerado um arquivo mp3. Esta é, no entanto, a maneira como um espaço principal deve ser tratado. Eg .gitignorenão é um formato de arquivo
kon psych
24

Use a pathlibpartir do Python3.4 em diante.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'
Greg
fonte
1
Esta é a melhor solução
maio
17

Veja o módulo fnmatch. Isso fará o que você está tentando fazer.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file
John Gaines Jr.
fonte
7

uma maneira fácil poderia ser:

import os

if os.path.splitext(file)[1] == ".mp3":
    # do something

os.path.splitext(file)retornará uma tupla com dois valores (o nome do arquivo sem extensão + apenas a extensão). O segundo índice ([1]) fornecerá apenas a extensão. O legal é que, dessa maneira, você também pode acessar o nome do arquivo com bastante facilidade, se necessário!

upgrd
fonte
6

ou talvez:

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else
phynfo
fonte
4

Um tópico antigo, mas pode ajudar futuros leitores ...

Eu evitaria o uso de .lower () nos nomes de arquivos se por outro motivo não fosse tornar seu código mais independente da plataforma. (linux faz distinção entre maiúsculas e minúsculas, .lower () em um nome de arquivo certamente corromperá sua lógica eventualmente ... ou pior, um arquivo importante!)

Por que não usar re ? (Embora seja ainda mais robusto, você deve verificar o cabeçalho do arquivo mágico de cada arquivo ... Como verificar o tipo de arquivo sem extensões em python? )

import re

def checkext(fname):   
    if re.search('\.mp3$',fname,flags=re.IGNORECASE):
        return('mp3')
    if re.search('\.flac$',fname,flags=re.IGNORECASE):
        return('flac')
    return('skip')

flist = ['myfile.mp3', 'myfile.MP3','myfile.mP3','myfile.mp4','myfile.flack','myfile.FLAC',
     'myfile.Mov','myfile.fLaC']

for f in flist:
    print "{} ==> {}".format(f,checkext(f)) 

Resultado:

myfile.mp3 ==> mp3
myfile.MP3 ==> mp3
myfile.mP3 ==> mp3
myfile.mp4 ==> skip
myfile.flack ==> skip
myfile.FLAC ==> flac
myfile.Mov ==> skip
myfile.fLaC ==> flac
Dan F.
fonte
3
import os
source = ['test_sound.flac','ts.mp3']

for files in source:
   fileName,fileExtension = os.path.splitext(files)
   print fileExtension   # Print File Extensions
   print fileName   # It print file name
Rajan Mandanka
fonte
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Christian Papathanasiou
fonte
3
Isso não funcionará para arquivos que contenham vários .s, por exemplosome.test.file.mp3
Nick
3
Você poderia fazer [-1] para capturar esse caso de borda.
Christian Papathanasiou
1
#!/usr/bin/python

import shutil, os

source = ['test_sound.flac','ts.mp3']

for files in source:
  fileName,fileExtension = os.path.splitext(files)

  if fileExtension==".flac" :
    print 'This file is flac file %s' %files
  elif  fileExtension==".mp3":
    print 'This file is mp3 file %s' %files
  else:
    print 'Format is not valid'
nprak
fonte
0
file='test.xlsx'
if file.endswith('.csv'):
    print('file is CSV')
elif file.endswith('.xlsx'):
    print('file is excel')
else:
    print('none of them')
Anil Dubey
fonte
5
Descrever algo sobre sua resposta vai ajudar os outros a entender facilmente, consulte stackoverflow.com/help/how-to-answer
Anjo F Syrus