2017-02-13 55 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')]