检查文件扩展名

wko*_*son 138 python file-extension

我正在处理某个程序,如果有问题的文件是flac文件或mp3文件,我需要让它做不同的事情.我可以用这个吗?

if m == *.mp3
   ...
elif m == *.flac
   ...
Run Code Online (Sandbox Code Playgroud)

我不确定它是否会起作用.

编辑: 当我使用它时,它告诉我无效的语法.那我该怎么办?

laf*_*ras 310

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

if m.endswith('.mp3'):
...
elif m.endswith('.flac'):
...
Run Code Online (Sandbox Code Playgroud)

为了区分大小写,并消除一个可能很大的else-if链:

m.lower().endswith(('.png', '.jpg', '.jpeg'))
Run Code Online (Sandbox Code Playgroud)

(感谢Wilhem Murdoch的args列表m)

  • _ext = m.rpartition('.')[ - 1]; 如果ext == _会更有效率 (2认同)

Aco*_*orn 52

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."
Run Code Online (Sandbox Code Playgroud)

得到:

/folder/soundfile.mp3 is an mp3!
folder1/folder/soundfile.flac is a flac file!

  • 这不考虑带有句点的文件夹名称。(`C:/folder.jpg/file.mp3` 是有效路径)。您可以使用“os.path.isfile(m)”排除那些 (2认同)

Joh*_*Jr. 16

看看模块fnmatch.这将做你想做的事情.

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file
Run Code Online (Sandbox Code Playgroud)


小智 7

pathlib从Python3.4开始使用。

from pathlib import Path
Path('my_file.mp3').suffix == '.mp3'
Run Code Online (Sandbox Code Playgroud)


phy*_*nfo 6

也许:

from glob import glob
...
for files in glob('path/*.mp3'): 
  do something
for files in glob('path/*.flac'): 
  do something else
Run Code Online (Sandbox Code Playgroud)


Ste*_*ica 6

在检查扩展名之前,您应该确保“文件”实际上不是文件夹。上面的一些答案没有考虑带句点的文件夹名称。(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")
Run Code Online (Sandbox Code Playgroud)

输出:

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")
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

输出:

It's an mp3
Run Code Online (Sandbox Code Playgroud)

将文件扩展名与多种类型进行比较:

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")
Run Code Online (Sandbox Code Playgroud)

输出:

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)
Run Code Online (Sandbox Code Playgroud)


upg*_*grd 5

一个简单的方法可能是:

import os

if os.path.splitext(file)[1] == ".mp3":
    # do something
Run Code Online (Sandbox Code Playgroud)

os.path.splitext(file)将返回具有两个值的元组(不带扩展名的文件名+仅带扩展名的文件名)。因此,第二个索引([1])仅给您扩展名。很棒的事情是,如果需要,您还可以通过这种方式很容易地访问文件名!


Dan*_* F. 5

一个旧线程,但可能会帮助未来的读者......

如果没有其他原因,我会避免在文件名上使用.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)) 
Run Code Online (Sandbox Code Playgroud)

输出:

myfile.mp3 ==> mp3
myfile.MP3 ==> mp3
myfile.mP3 ==> mp3
myfile.mp4 ==> skip
myfile.flack ==> skip
myfile.FLAC ==> flac
myfile.Mov ==> skip
myfile.fLaC ==> flac
Run Code Online (Sandbox Code Playgroud)