在Python中,在具有特定扩展名的目录中构建文件列表的最快方法
在GNU/Linux系统上的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
.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)]