2017-02-13 63 views
0

sel_dirs列表過濾文件是由用戶提供的目錄來搜索的.xlsx文件的列表:列表理解在目錄

results_excels = [] 
for each_dir in sel_dirs: 
    for each_file in os.listdir(os.path.abspath(os.path.join(my_dir, each_dir))): 
     if each_file.endswith("_Results.xlsx"): 
       results_excels.append(os.path.abspath(os.path.join(my_dir, each_dir, each_file))) 

什麼是收集所有結果的列表,最徹底的方法列表提供的目錄中的Excel文件,可能有列表理解,可以在目錄的列表上評估,而不僅僅是在一個目錄上?

results_excels = [filename for filename in os.listdir(LIST) if filename.endswith("_Results.xlsx")] 

其中LIST是目錄的sel_dirs列表而不是一個目錄?

+0

_cleanest_可能是您首先完成的方式。你*可以將它變成[嵌套理解](http://stackoverflow.com/questions/18072759/python-nested-list-comprehension),但這會更難以閱讀。 – glibdud

回答

0

問題歸結爲:如何將列表列表放入一個列表中?因爲.listdir()返回一個列表,你不能做一個簡單的理解。

符合itertools.chain。它挑選一個迭代列表並按順序迭代它們,這是理解所需要的。 唯一的細節是listdir的值需要與目錄的路徑一致,否則會丟失。

import itertools 

files_in_dir = lambda d: [os.path.join(d, fname) for fname in os.listdir(d)] 
file_lists = [files_in_dir(d) for d in sel_dirs] 
all_files = itertools.chain(*file_lists) 
excel_files = [f for f in all_files if f.endswith('.xlsx')]