在Python中,在具有特定扩展名的目录中构建文件列表的最快方法

在Python中,在具有特定扩展名的目录中构建文件列表的最快方法,python,linux,optimization,recursion,filesystems,Python,Linux,Optimization,Recursion,Filesystems,在GNU/Linux系统上的Python中,递归扫描目录中所有.MOV或.AVI文件并将其存储在列表中的最快方法是什么 当前目录中文件列表的示例。您可以针对特定路径展开此选项 import glob movlist = glob.glob('*.mov') 您可以使用os.walk()进行递归遍历,使用glob.glob()或fnmatch.filter()进行文件匹配: 选中此项我将使用os.walk扫描目录,os.path.splitext获取后缀并自己过滤它们 suffixes = se

在GNU/Linux系统上的Python中,递归扫描目录中所有
.MOV
.AVI
文件并将其存储在列表中的最快方法是什么

当前目录中文件列表的示例。您可以针对特定路径展开此选项

import glob
movlist = glob.glob('*.mov')
您可以使用os.walk()进行递归遍历,使用glob.glob()或fnmatch.filter()进行文件匹配:


选中此项

我将使用os.walk扫描目录,os.path.splitext获取后缀并自己过滤它们

suffixes = set(['.AVI', '.MOV'])
for dirpath, dirnames, filenames in os.walk('.'):
    for f in filenames:
        if os.path.splitext(f)[1] in suffixes:
            yield os.path.join(dirpath, f)
Python2.x:

import os

def generic_tree_matching(rootdirname, filterfun):
    return [
        os.path.join(dirname, filename)
        for dirname, dirnames, filenames in os.walk(rootdirname)
        for filename in filenames
        if filterfun(filename)]

def matching_ext(rootdirname, extensions):
    "Case sensitive extension matching"
    return generic_tree_matching(
        rootdirname,
        lambda fn: fn.endswith(extensions))

def matching_ext_ci(rootdirname, extensions):
    "Case insensitive extension matching"
    try:
        extensions= extensions.lower()
    except AttributeError: # assume it's a sequence of extensions
        extensions= tuple(
            extension.lower()
            for extension in extensions)
    return generic_tree_matching(
        rootdirname,
        lambda fn: fn.lower().endswith(extensions))
matching_ext
matching_ext_ci
与根文件夹和扩展名或扩展名元组的参数一起使用:

>>> matching_ext(".", (".mov", ".avi"))

我建议使用
os.walk
和一个小心的

这可能是一种单线性方法:

[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)]

is\u video
中,您可以检查扩展名。

最快的可能是编写扩展名以使用本机代码。但是你真的想这样做吗?即使你不想这样做,根据我们讨论的文件和目录的数量,执行外部
find
命令可能比处理
os.walk()
的结果更快。但是如果
os.walk()
解决方案足够快,它会更优雅,更易于理解/编辑。该模块只支持非常简单的全局模式,因此您的过滤器将无法工作。@ekhumoro如果它工作,则允许符号([],,,,?,*,())对python代码进行全局测试,并查看您的模式与
*。[movaipg()]
。这将匹配,例如,
*.i
*.a
*.M
等,但不匹配
*.MOV
*.avi
等。自己试试吧!这可能是最好的解决方案,因为它可以很容易地进行调整,以强制执行不区分大小写的匹配。
[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)]