Python处理文件夹时如何避免嵌套for循环?
避免嵌套for循环的实现方式
首先要指出你原代码的一个明显问题:每次内层循环都会重复读取同一个CSV文件,这是完全没必要的性能浪费——同一个文件读一次就够了,不需要为每个变量重复读。下面提供几种优化方案,既能避免不必要的IO操作,也能实现消除嵌套循环的需求。
方案1:先读文件再遍历变量(最直观的优化)
把文件读取逻辑提到内层循环外面,每个文件只读取一次,再针对所有变量生成输出,同时用pathlib替代字符串拼接处理路径,更安全可靠:
import pandas as pd from pathlib import Path list_of_file_paths = ['C:\\Users\\user\\Desktop\\folder_source\\file_id1.csv', 'C:\\Users\\user\\Desktop\\folder_source\\file_id2.csv'] list_of_variables = ['heat', 'patience', 'charmander'] target_path = Path(r'C:\Users\user\Desktop\folder_target') # 确保目标目录存在,不存在则创建 target_path.mkdir(exist_ok=True) for filepath_load in list_of_file_paths: # 仅读取一次当前文件 df = pd.read_csv(filepath_load) # 用pathlib解析文件名,提取id file_stem = Path(filepath_load).stem id_number = file_stem.split("_")[-1] # 遍历变量生成输出文件 for variable in list_of_variables: output_file = target_path / f"{id_number}_{variable}.csv" df.to_csv(output_file, index=False)
方案2:用itertools.product扁平化循环
如果想彻底消除嵌套的视觉结构,可以用itertools.product生成文件ID和变量的所有组合,但前提是先把文件内容缓存起来,避免重复读取:
import pandas as pd from pathlib import Path from itertools import product list_of_file_paths = ['C:\\Users\\user\\Desktop\\folder_source\\file_id1.csv', 'C:\\Users\\user\\Desktop\\folder_source\\file_id2.csv'] list_of_variables = ['heat', 'patience', 'charmander'] target_path = Path(r'C:\Users\user\Desktop\folder_target') target_path.mkdir(exist_ok=True) # 先缓存所有文件的内容,key是文件ID,value是对应的DataFrame file_cache = {} for filepath_load in list_of_file_paths: df = pd.read_csv(filepath_load) file_stem = Path(filepath_load).stem id_number = file_stem.split("_")[-1] file_cache[id_number] = df # 用product生成ID和变量的所有组合,实现扁平化循环 for id_num, var in product(file_cache.keys(), list_of_variables): output_file = target_path / f"{id_num}_{var}.csv" file_cache[id_num].to_csv(output_file, index=False)
核心优化说明
- 减少IO操作:原代码的嵌套循环最大问题是重复读文件,优化后每个文件仅读取一次,这是提升性能的关键
- 路径处理更安全:用
pathlib替代字符串拼接,自动适配不同操作系统的路径分隔符,避免转义错误 - 扁平化循环的意义:如果只是为了代码结构上消除嵌套,
itertools.product是合适的选择,但核心还是要先解决重复IO的问题
内容的提问来源于stack exchange,提问作者Clay Campbell
相关产品推荐
相关产品推荐

