Python如何无需指定子文件夹名自动合并多层子文件夹内的CSV文件
按实验条件自动合并CSV实现方案
核心需求匹配
- 无需手动预设条件编号、条件名称,自动识别主文件夹下所有条件目录
- 无需手动配置每个重复实验、每个CSV的具体路径,自动递归定位目标文件
- 按实验条件分组合并同组下所有重复实验的
contact_events.csv,不会跨条件混合数据 - 适配任意数量的实验条件、任意数量的重复实验,不受文件夹嵌套小幅度变动影响
原有代码存在的问题
- 缩进不规范,循环层级逻辑错位,容易出现变量未定义就调用的报错
- 所有读取的CSV都存入同一个全局列表,最终合并结果是所有条件的混合数据,没有按条件分组
- 写死了4层固定嵌套循环,只要文件夹层级有调整就会完全失效
- 缺少异常容错,遇到CSV损坏、空文件夹的情况会直接中断运行
可直接运行的实现代码
import os import pandas as pd from pathlib import Path # 若脚本放在实验主文件夹下,直接用当前路径即可,无需手动改路径 root_path = Path.cwd() # 如果要指定固定主路径,替换成下面这行即可,注意路径前加r前缀 # root_path = Path(r"C:\Users\victo\OneDrive\Bureaublad\data") # 存储按条件分组的合并结果,键为条件名,值为合并后的DataFrame condition_combined = {} # 递归搜索所有路径下名为contact_events.csv的目标文件 for csv_path in root_path.rglob("contact_events.csv"): # 路径结构校验:主目录/条件文件夹/重复文件夹/contact events/contact_events.csv # 取csv文件往上3级的文件夹,就是对应的实验条件目录 condition_folder = csv_path.parents[2] # 只处理主文件夹下一级子目录对应的条件,过滤其他位置的无关CSV if condition_folder.parent != root_path: continue condition_name = condition_folder.name # 读取当前CSV,加入对应条件的分组 try: df = pd.read_csv(csv_path) # 可选:新增两列标记来源重复实验、来源文件路径,方便后续溯源 df["source_repeat"] = csv_path.parents[1].name df["source_file"] = str(csv_path) except Exception as e: print(f"读取文件{csv_path}失败,跳过:{str(e)}") continue # 初始化条件分组或追加数据 if condition_name not in condition_combined: condition_combined[condition_name] = df else: condition_combined[condition_name] = pd.concat([condition_combined[condition_name], df], ignore_index=True) # 遍历所有条件,输出结果、保存合并后的文件 for cond_name, combined_df in condition_combined.items(): print(f"条件【{cond_name}】合并完成,共{len(combined_df)}条数据") # 合并结果保存到对应条件文件夹下 save_path = root_path / cond_name / "merged_contact_events.csv" combined_df.to_csv(save_path, index=False, encoding="utf-8-sig") # 调用指定条件的合并结果时,直接取condition_combined["对应条件名"]即可
使用说明
- 直接把脚本放到实验数据主文件夹(即存放Condition 1、Condition 2的一级文件夹)下运行即可,不需要修改任何路径配置
- 运行完成后,每个条件文件夹下会自动生成
merged_contact_events.csv,就是该条件下所有重复实验的合并结果 - 自动跳过损坏、无法读取的CSV文件,不会因为单个文件问题中断整个合并流程
- 合并后的数据自带重复实验来源标记,方便后续做数据校验
内容的提问来源于stack exchange,提问作者Viktoria
相关产品推荐
相关产品推荐

