问题描述
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列表,而不仅仅是一个目录?
1楼
问题归结为:如何将列表列表变成一个列表?
由于.listdir()
返回列表,因此您无法进行简单的理解。
认识itertools.chain
。
它会选择一个可迭代的列表,并顺序地对其进行迭代,这正是理解能力所需要的。
唯一的细节是listdir
的值必须在dir的路径之前,否则它会丢失。
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')]