Проверка расширения файла
Я работаю над определенной программой, и мне нужно, чтобы она делала разные вещи, если файл, о котором идет речь, является файлом flac или файлом mp3. Могу я просто воспользоваться этим?
if m == *.mp3 .... elif m == *.flac ....
Я не уверен, будет ли она работать.
EDIT: Когда я использую это, он говорит мне недопустимый синтаксис. Так что же мне делать?
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