Как я могу проверить расширение файла?

179

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

if m == *.mp3
   ...
elif m == *.flac
   ...
wkoomson
источник
используйте для соответствия модуль Python re (regex)
kefeizhou
21
@kefeizhou: Боже, нет, не для простых матчей.
orlp

Ответы:

384

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

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

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

m.lower().endswith(('.png', '.jpg', '.jpeg'))
lafras
источник
2
ext = m.rpartition ('.') [- 1]; если ext == будет намного эффективнее
вулкан
1
@WilhelmMurdoch Я почти не видел твой комментарий, рад, что я сделал.
Флодр
@ Volcano почему бы не использовать .split('.')[-1]? Или rpartition действительно высокая эффективность?
Скотт Андерсон
55

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

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 - это mp3!
folder1 / folder / soundfile.flac - это файл flac!
Желудь
источник
Этот метод игнорирует начальные периоды, поэтому /.mp3не считается mp3-файлом. Это, однако, способ обработки ведущего пространства. Например, .gitignoreэто не формат файла
kon psych
24

Используйте pathlibначиная с Python3.4.

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'
Greg
источник
1
Это самое лучшее решение
может
17

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

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file
Джон Гейнс младший
источник
7

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

import os

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

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

upgrd
источник
6

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

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else
phynfo
источник
4

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

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

Почему бы не использовать ре ? (Хотя чтобы быть еще более надежным, вы должны проверить магический заголовок каждого файла ... Как проверить тип файлов без расширений в 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
Дэн Ф.
источник
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
Раджан Манданка
источник
2
if (file.split(".")[1] == "mp3"):
    print "its mp3"
elif (file.split(".")[1] == "flac"):
    print "its flac"
else:
    print "not compat"
Кристиан Папатанасиу
источник
3
Это не будет работать для файлов, содержащих несколько .s, напримерsome.test.file.mp3
Ник
3
Вы можете сделать [-1], чтобы захватить этот крайний случай.
Кристиан Папатанасиу
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
источник
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')
Анил Дубей
источник
5
Опишите что-нибудь о своем ответе, это поможет другим понять легко, см. Stackoverflow.com/help/how-to-answer
Angel F Syrus