在目录中递归查找特定扩展名的文件

5 投票
1 回答
7592 浏览
提问于 2025-04-18 00:19

不知道为什么,这段代码返回了一个空列表,我完全搞不懂原因。

import os, fnmatch

vidext = ['.avi', '.mkv', '.wmv', '.mp4', '.mpg', '.mpeg', '.mov', '.m4v']

def findExt(folder):
    matches = []
    for root, dirnames, filenames in os.walk(folder):
        for extension in vidext:
            for filename in fnmatch.filter(filenames, extension):
                matches.append(os.path.join(root, filename))
    return matches

print(findExt("D:\TVRip"))

1 个回答

13

你需要在每个扩展名后面加上一个通配符,这样fnmatch.filter()才能匹配:

fnmatch.filter(filenames, '*' + extension)

不过在这里其实根本不需要用到fnmatch。直接使用str.endswith()就可以了:

for root, dirnames, filenames in os.walk(folder):
    for filename in filenames:
        if filename.endswith(extensions):
            matches.append(os.path.join(root, filename))

或者可以用列表推导式来表示:

return [os.path.join(r, fn)
        for r, ds, fs in os.walk(folder) 
        for fn in fs if fn.endswith(extensions)]

撰写回答