我在一个特定的程序上工作,我需要根据文件的扩展名做不同的事情。我能用这个吗?

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

当前回答

一个老帖子,但可能对未来的读者有所帮助…

如果没有其他原因,我将避免在文件名上使用.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

其他回答

操作系统。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 is an mp3!
folder1/folder/soundfile.flac is a flac file!

在检查扩展名之前,您应该确保“文件”实际上不是一个文件夹。上面的一些答案没有说明带句点的文件夹名称。(folder.mp3是一个有效的文件夹名)。


检查文件扩展名:

import os

file_path = "C:/folder/file.mp3"
if os.path.isfile(file_path):
    file_extension = os.path.splitext(file_path)[1]
    if file_extension.lower() == ".mp3":
        print("It's an mp3")
    if file_extension.lower() == ".flac":
        print("It's a flac")

输出:

It's an mp3

检查文件夹中所有文件的扩展名:

import os

directory = "C:/folder"
for file in os.listdir(directory):
    file_path = os.path.join(directory, file)
    if os.path.isfile(file_path):
        file_extension = os.path.splitext(file_path)[1]
        print(file, "ends in", file_extension)

输出:

abc.txt ends in .txt
file.mp3 ends in .mp3
song.flac ends in .flac

比较多种类型的文件扩展名:

import os

file_path = "C:/folder/file.mp3"
if os.path.isfile(file_path):
    file_extension = os.path.splitext(file_path)[1]
    if file_extension.lower() in {'.mp3', '.flac', '.ogg'}:
        print("It's a music file")
    elif file_extension.lower() in {'.jpg', '.jpeg', '.png'}:
        print("It's an image file")

输出:

It's a music file

从Python3.4开始使用。

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

如果您正在处理包含句点的文件夹,则可以使用

Path('your_folder.mp3').is_file() and Path('your_folder.mp3').suffix == '.mp3'

确保后缀为.mp3的文件夹不会被解释为mp3文件。

file='test.xlsx'
if file.endswith('.csv'):
    print('file is CSV')
elif file.endswith('.xlsx'):
    print('file is excel')
else:
    print('none of them')

查看模块fnmatch。它会达到你想要的效果。

import fnmatch
import os

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