如何检查文件的扩展名?


178

我正在某个程序上工作,根据文件的扩展名,我需要做不同的事情。我可以用这个吗?

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

使用Python re模块(正则表达式),用于匹配
kefeizhou

21
@kefeizhou:哦,天哪,不是简单的比赛。
2011年

Answers:


383

假设m是一个字符串,可以使用endswith

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

要不区分大小写并消除可能很大的else-if链:

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

2
ext = m.rpartition('。')[-1]; 如果ext ==将更加有效
火山

1
@WilhelmMurdoch我差点没看到您的评论,很高兴我做到了。
Flaudre

@volcano为什么不使用.split('.')[-1]?还是rpartition确实效率很高?
斯科特·安德森

55

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是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的情况下sensistive,.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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.