检查文件类型是否为媒体文件?

时间:2019-03-22 21:22:17

标签: python python-3.x

我试图遍历文件列表,并返回那些属于媒体文件(图像,视频,gif,音频等)的文件。

看到媒体类型很多,有没有一种库或也许更好的方法来检查媒体类型,而不是列出所有类型然后对照该列表检查文件?

这是我到目前为止正在做的事情:

import os
types = [".mp3", ".mpeg", ".gif", ".jpg", ".jpeg"]
files = ["test.mp3", "test.tmp", "filename.mpg", ".AutoConfig"]

media_files = []
for file in files:
    root, extention = os.path.splitext(file)
    print(extention)
    if extention in types:
        media_files.append(file)

print("Found media files are:")
print(media_files)

但是请注意,它不包括filename.mpg,因为我忘记将.mpg放在我的types列表中。 (或者,更可能的是,我不希望该列表包含一个.mpg文件,因此也没有考虑将其列出。)

3 个答案:

答案 0 :(得分:2)

为此,您需要获取文件的互联网媒体类型,将其用/字符分割,然后检查其是否以音频,视频,图像开头。

这是示例代码:

import mimetypes
mimetypes.init()

mimestart = mimetypes.guess_type("test.mp3")[0]

if mimestart != None:
    mimestart = mimestart.split('/')[0]

    if mimestart == 'audio' or mimestart == 'video' or mimestart == 'image':
        print("media types")

注意::此方法假定文件类型以其扩展名而不打开实际文件,它仅基于文件扩展名

答案 1 :(得分:1)

还有另一种方法,它不基于文件扩展名而是基于使用媒体类型库pypi.org/project/python-libmagic的文件内容:

这是该库的示例代码:

import magic

magic = magic.Magic()
mimestart = magic.from_file("test.mp3").split('/')[0]

if mimestart == 'audio' or mimestart == 'video' or mimestart == 'image':
    print("media types")

注意::要使用此代码示例,您需要安装python-libmagic槽式点子。

答案 2 :(得分:0)

您可以按如下方式列出媒体文件,
lsmedia.py

import os

def lsmedia(mypath):
    img_fm = (".tif", ".tiff", ".jpg", ".jpeg", ".gif", ".png", ".eps", 
          ".raw", ".cr2", ".nef", ".orf", ".sr2", ".bmp", ".ppm", ".heif")
    vid_fm = (".flv", ".avi", ".mp4", ".3gp", ".mov", ".webm", ".ogg", ".qt", ".avchd")
    aud_fm = (".flac", ".mp3", ".wav", ".wma", ".aac")
    media_fms = {"image": img_fm, "video": vid_fm, "audio": aud_fm}

    fns = lambda path, media : [fn for fn in os.listdir(path) if any(fn.lower().endswith(media_fms[media]) for ext in media_fms[media])]
    img_fns, vid_fns, aud_fns = fns(mypath, "image"), fns(mypath, "video"), fns(mypath, "audio")

    print(f"State of media in '{mypath}'")
    print("Images: ", len(img_fns), " | Videos: ", len(vid_fns), "| Audios: ", len(aud_fns))
    
    return (img_fns, vid_fns, aud_fns)

mypath = "/home/DATA_Lia/data_02/sample" # define dir
(imgs, vids, auds) = lsmedia(mypath)

输出:

State of media in '/home/DATA_Lia/data_02/sample'
Images:  24  | Videos:  3 | Audios:  5