2016-02-26 72 views
0

給定一個文件名列表,如果它們存在於給定目錄或其子目錄中,我想爲這些文件創建完整路徑。現在我使用此代碼搜索目錄中文件列表的最快方法

def construct_path(file_list, directory): 
    file_path_list = [] 
    for name in file_list: 
     for dir, subdir, filenames in os.walk(directory): 
      if name in filenames: 
       file_path_list.append(os.path.join(dir, name)) 

    return file_path_list 

因此,此處正在爲列表中的每個文件抓取目錄。有沒有更快/更好的方法來做到這一點?

+0

逆轉循環的順序可能會做它。也許從'file_list'中刪除找到的名字可能會有所幫助。如果你能找到他們,請儘早離開。 – Blorgbeard

+0

看看這個東西,它使用本地調用https://docs.python.org/3/library/os.html#os.scandir – Andrey

回答

2

可以刪除環比file_list,並從該列表中刪除找到的文件,這樣你就可以返回結果,一旦你找到你的所有文件:

def construct_path(file_list, directory): 
    file_path_list = [] 
    for dir, subdir, files in os.walk(directory): 
     for name in files: 
      if name in file_list: 
       file_path_list.append(os.path.join(dir, name)) 
       file_list.remove(name) 
      if (len(file_list)==0): return file_path_list 
    return file_path_list 
+0

這仍然爬取每個文件的目錄 – user3527975

+0

是的,但它只做了一次,並且如果在抓取所有文件之前找到所有文件,則應該能夠提前返回。 – Jaco

+1

雖然看起來只是兩個循環的交換,但是'os.walk'需要磁盤I/O,而'for file in name'則出現在內存中,速度要快得多。這就是爲什麼'os.walk'只有一次速度增益。 –

相關問題