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

如何遍历目录下CSV文件生成两两不重复配对执行数据分析?

问题背景

当前工作目录下存储25个CSV格式数据文件,需遍历所有文件生成无重复两两配对,传入自定义分析算法执行。目前目录下CSV文件列表获取逻辑运行正常,但配对循环逻辑编写错误,调试后仍无法达到预期效果。

已验证正常的文件列表获取代码

# This works
import os
import pandas as pd

a_list = []
path = os.getcwd()
for filename in os.listdir(path):
    if filename.endswith('.csv'):
        a_list.append(filename)

存在异常的原有配对代码

# This does not work
list_of_used_dfs = []
for element_1, element_2 in enumerate(a_list):
    # If name of elements is same, cycle to next element
    if element_1 == element_2:
        element_2 = a_list[element_2 + 1]
        # if element_1 or element_2 are in list_of_used_dfs, cycle to next non-matching pairs
        # I don't believe this is the correct approach
        if element_1, element_2 in list_of_used_dfs:
            element_1 = element_1 + 1
            element_2 = element_2 + 1
    else:
        list_of_used_dfs.append(element_1)
        list_of_used_dfs.append(element_2)

        # dataframes to be used for analysis
        df1 = pd.read_csv(element_1)
        df2 = pd.read_csv(element_2)
    
        

*** algorithm ***

测试环境与预期逻辑

  • 测试目录文件结构:
df1.csv
df2.csv
df3.csv
df4.csv
df5.csv
df6.csv
  • 代码获取到的文件列表示例:
['df1.csv','df2.csv','df3.csv','df4.csv','df5.csv','df6.csv']
  • 预期配对规则:依次选取列表中每个CSV文件作为df_a,与其后所有未配对过的CSV文件(作为df_b)组成文件对,读取为DataFrame后传入分析算法,不出现重复配对、不出现文件与自身配对的情况。配对顺序示例:
df_a = df1.csv, df_b = df2.csv → 执行算法
df_a = df1.csv, df_b = df3.csv → 执行算法
df_a = df1.csv, df_b = df4.csv → 执行算法
...
df_a = df2.csv, df_b = df3.csv → 执行算法
...
  • CSV文件内数据结构样例:
type    timestamp   open    high    low close   base_volume quote_volume    num_orders
pair    1.59896E+12 6.08    15.97   6.08    10.68   1973917.073 2.30E+07    33610
pair    1.59896E+12 10.679  11.49   10.1    10.906  756307.741  8.24E+06    13534
pair    1.59897E+12 10.905  10.918  9.463   9.934   801510.45   8.17E+06    15155
pair    1.59897E+12 9.917   10.87   9.35    10.848  784286.785  7.83E+06    13810
pair    1.59897E+12 10.848  10.985  9.88    10.22   709953.023  7.33E+06    12660
pair    1.59898E+12 10.22   10.888  9.805   10.129  497659.567  5.09E+06    10409
pair    1.59898E+12 10.121  10.917  10.051  10.451  392647.768  4.10E+06    8496
pair    1.59898E+12 10.46   10.67   10.364  10.366  185948.208  1.95E+06    4352
pair    1.59899E+12 10.38   10.415  10.037  10.166  246411.785  2.53E+06    3919
pair    1.59899E+12 10.168  10.769  9.95    10.5    389719.541  4.01E+06    7963
实现方案

原有代码的核心问题有两个:一是错误使用enumerate返回值,enumerate遍历返回的是(索引, 元素值)元组,原有逻辑把整数索引当成文件名传入pd.read_csv必然报错;二是手动维护已使用文件列表的逻辑冗余且容易出错,这类无重复两两组合的需求不需要手动做重复判断,用索引控制遍历范围或者直接用标准库工具即可实现。

方案1:原生双层循环(无额外依赖,逻辑直观)

通过两层索引循环控制,让第二个文件的索引永远大于第一个文件的索引,天生保证无重复配对、无自配对:

# 如需固定配对顺序,循环前先对文件列表排序
# 适配df1.csv~df25.csv这类命名的数字排序,避免字符串排序导致df10排在df2前的问题
a_list.sort(key=lambda x: int(x.removeprefix("df").removesuffix(".csv")))

for i in range(len(a_list)):
    df_a = pd.read_csv(a_list[i])
    # 只遍历i位置之后的文件做配对,不会重复
    for j in range(i + 1, len(a_list)):
        df_b = pd.read_csv(a_list[j])
        
        # 此处写入自定义分析算法逻辑
        # *** algorithm ***
        print(f"当前处理配对:{a_list[i]} <-> {a_list[j]}")

方案2:用itertools.combinations(代码更简洁)

Python标准库itertools.combinations天生用于生成无重复的元素组合,直接传入列表和组合长度2,就能得到所有符合要求的两两配对,顺序和双层循环完全一致:

from itertools import combinations

# 排序逻辑同上
a_list.sort(key=lambda x: int(x.removeprefix("df").removesuffix(".csv")))

for file_a, file_b in combinations(a_list, 2):
    df_a = pd.read_csv(file_a)
    df_b = pd.read_csv(file_b)
    
    # 此处写入自定义分析算法逻辑
    # *** algorithm ***
    print(f"当前处理配对:{file_a} <-> {file_b}")

配对效果说明

以测试目录下6个文件为例,上述两种方案都会生成15组符合预期的配对,顺序完全匹配需求:

  • df1.csv 依次配对 df2.csv、df3.csv、df4.csv、df5.csv、df6.csv
  • df2.csv 依次配对 df3.csv、df4.csv、df5.csv、df6.csv
  • df3.csv 依次配对 df4.csv、df5.csv、df6.csv
  • df4.csv 依次配对 df5.csv、df6.csv
  • df5.csv 配对 df6.csv

不需要额外维护已使用文件列表,也不会出现重复读取、索引越界的问题。

内容的提问来源于stack exchange,提问作者jd_h2003

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:31:03