如何遍历目录下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
相关产品推荐
相关产品推荐

