Як я можу перевірити розширення файлу?


178

Я працюю над певною програмою, де мені потрібно робити різні речі залежно від розширення файлу. Чи можу я просто використати це?

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

використовувати модуль python re (regex) для відповідності
kefeizhou

21
@kefeizhou: Боже ні, не для простих матчів.
orlp

Відповіді:


383

Припускаючи m, що це рядок, ви можете використовувати endswith:

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

Щоб бути нечутливим до регістру та усунути потенційно великий ланцюг:

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

2
ext = m.rpartition ('.') [- 1]; якщо ext == буде набагато ефективнішим
вулкан

1
@WilhelmMurdoch я майже не побачив ваш коментар, радий, що я це зробив.
Флод

@volcano чому б не використовувати .split('.')[-1]? Або розділення дійсно висока ефективність?
Скотт Андерсон

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'

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]) дасть вам лише розширення. Прикольна річ у тому, що таким чином ви також можете легко отримати доступ до імені файлу, якщо потрібно!


6

а може:

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

4

Стара тема, але може допомогти майбутнім читачам ...

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

Чому б не використовувати 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

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


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'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.