You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:55:20