2014-03-28 84 views
3

由於某種原因,這會返回一個空列表,我不知道爲什麼。在目錄中遞歸搜索具有特定擴展名的文件

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")) 

回答

8

你需要一個通配符添加到每個擴展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)] 
+0

謝謝,非常完美!這是實現這個目標的最快方法嗎? – yaka

+1

是的,我會說這是最快的方式; 'endswith()'測試完全在C代碼中進行。 –

+0

太棒了!我如何排除列表理解方法中的特定董事?如果fn.endswith(擴展名)和'.dir_to_exclude'不在ds]'中,我嘗試了'...在fs中的fn。但沒有效果。 – buhtz

相關問題