使用os.listdir()处理文件夹文件仅保存最后一个结果的问题求助
问题原因分析
- 保存逻辑位置错误:你把文件保存的代码放在了
for循环外面,循环跑完207个文件夹后,只会用最后一次循环的directory和处理后的df执行保存,前面206个文件夹的处理结果都被覆盖,根本没存下来。 - 冗余的CSV读取:
try块里已经读取了一次CSV,后面又重复读了一遍,纯粹浪费资源,完全可以删掉重复的那行。
修复后的代码
def ind_quant_table_full(repository_path, ionization_mode, file_extention, data_process_origin, use_ion_identity, min_score_final, min_ConfidenceScore, min_ZodiacScore): path = os.path.normpath(repository_path) # 只保留目录下的文件夹,避免文件进入循环 samples_dir = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))] # 提前创建结果文件夹,不用循环里重复创建 pathout_folder = os.path.join(path, 'results/') os.makedirs(pathout_folder, exist_ok=True) for directory in tqdm(samples_dir): quant_path = os.path.join(path, directory, ionization_mode, directory + '_features_quant_' + ionization_mode + '.csv') try: df = pd.read_csv(quant_path, sep=',') except FileNotFoundError: continue except NotADirectoryError: continue # 捕获其他未知错误,方便排查 except Exception as e: print(f"处理目录 {directory} 时出错: {str(e)}") continue # 这里放你的数据处理逻辑 [do something to df] # 把保存代码缩进,放到循环内部,处理完一个就存一个 pathout = os.path.join(pathout_folder, f"{directory}_{ionization_mode}_quant_annotations.tsv") df.to_csv(pathout, sep='\t') print(f"结果已保存至: {pathout_folder}")
额外优化点
- 过滤文件夹:原代码的
samples_dir会包含目录下的所有文件和文件夹,加个判断只保留文件夹,避免无效循环。 - 统一异常捕获:新增通用异常捕获,能帮你快速定位某个文件夹处理失败的原因。
- 提前创建结果目录:把创建文件夹的代码移到循环外面,不用每次循环都执行一次判断,提升效率。
内容的提问来源于stack exchange,提问作者Luis Manuel Quiros guerrero
相关产品推荐
相关产品推荐

