Проверка расширения файла


Я работаю над определенной программой, и мне нужно, чтобы она делала разные вещи, если файл, о котором идет речь, является файлом flac или файлом mp3. Могу я просто воспользоваться этим?

if m == *.mp3
   ....
elif m == *.flac
   ....

Я не уверен, будет ли она работать.

EDIT: Когда я использую это, он говорит мне недопустимый синтаксис. Так что же мне делать?

10 100

10 ответов:

предполагая, что m - это строка, вы можете использовать endswith:

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

чтобы быть нечувствительным к регистру и исключить потенциально большую цепочку else-if:

m.lower().endswith(('.png', '.jpg', '.jpeg'))

(спасибо Wilhem Murdoch за список args to endswith)

os.path предоставляет множество функций для работы с путями/именами. ( docs)

os.path.splitext берет путь и разбивает расширение файла с конца его.

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."

выдает:

/folder/soundfile.mp3 is an mp3!
folder1/folder/soundfile.flac is a flac file!

посмотрите на модуль fnmatch. Это сделает то, что вы пытаетесь сделать.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file

или, возможно:

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

один простой способ может быть:

import os

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

os.path.splitext(file) вернет кортеж с двумя значениями (имя файла без расширения + только расширение). Второй индекс ([1]) даст вам только расширение. Самое классное, что таким образом вы также можете получить доступ к имени файла довольно легко, если это необходимо!

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
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
#!/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'

старая тема, но может помочь будущим читателям...

Я бы избежать используя .ниже() на имена файлов, если ни по какой другой причине, кроме как сделать ваш код более независимым от платформы. (linux и дело сенситивное,.ниже() на имя файла, безусловно, испортит вашу логику в конечном итоге ...или еще хуже, важный файл!)

почему бы не использовать re? (Хотя, чтобы быть еще более надежным, вы должны проверить волшебный файл заголовок каждого файла... Как проверить тип файлов без расширений в 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)) 

выход:

myfile.mp3 ==> mp3
myfile.MP3 ==> mp3
myfile.mP3 ==> mp3
myfile.mp4 ==> skip
myfile.flack ==> skip
myfile.FLAC ==> flac
myfile.Mov ==> skip
myfile.fLaC ==> flac

использовать pathlib С Питон3.4 года.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'