
本文介绍如何使用python自动遍历指定目录下的所有子文件夹,对每个子文件夹内的多个csv文件进行合并、统计分析与可视化,避免手动重复操作。核心在于正确构造文件路径、安全遍历子目录,并为每个子文件夹独立生成结果文件。
本文介绍如何使用python自动遍历指定目录下的所有子文件夹,对每个子文件夹内的多个csv文件进行合并、统计分析与可视化,避免手动重复操作。核心在于正确构造文件路径、安全遍历子目录,并为每个子文件夹独立生成结果文件。
在高通量细胞成像分析中(如96孔板实验),每个孔(well)通常对应一个子文件夹,内含4个视野(field)生成的CSV文件。若需为每个孔单独合并其下属CSV、绘制直方图并保存结果,手动修改路径运行96次显然不可行。关键挑战在于:路径拼接错误、glob用法误用、未构建完整绝对/相对路径、缺少异常处理及输出路径安全性校验。
下面提供一套健壮、可复用的解决方案,推荐使用 pathlib —— 它比 os + glob 更直观、跨平台兼容性更好,且路径操作更语义化。
✅ 正确做法:使用 pathlib 遍历子目录并逐个处理
from pathlib import Path
import pandas as pd
import matplotlib.pyplot as plt
# 设置根目录(包含所有well子文件夹)
root_dir = Path("path/to/folder/of/well/folders")
# 遍历每个直接子项
for subfolder in root_dir.iterdir():
# 仅处理子目录(跳过文件和隐藏项)
if not subfolder.is_dir() or subfolder.name.startswith('.'):
continue
print(f"Processing well: {subfolder.name}")
# 获取该子文件夹下所有 .csv 文件(支持通配符)
csv_files = list(subfolder.glob("*.csv"))
# 若无CSV文件,跳过(避免空合并报错)
if not csv_files:
print(f" ⚠️ No CSV files found in {subfolder.name}, skipping.")
continue
# 读取并合并所有CSV
df_list = []
for csv_file in csv_files:
try:
df = pd.read_csv(csv_file)
df_list.append(df)
except Exception as e:
print(f" ❌ Failed to read {csv_file.name}: {e}")
continue
if not df_list:
print(f" ⚠️ No valid DataFrames loaded from {subfolder.name}, skipping.")
continue
combined_df = pd.concat(df_list, ignore_index=True)
# 保存合并后的CSV(位于当前子文件夹内)
output_csv = subfolder / "combined.csv"
combined_df.to_csv(output_csv, index=False)
print(f" ✅ Saved merged CSV: {output_csv}")
# 绘制 'Mean' 列直方图并保存
if 'Mean' not in combined_df.columns:
print(f" ⚠️ Column 'Mean' not found in {subfolder.name}, skipping plot.")
continue
plt.figure(figsize=(6, 4))
combined_df['Mean'].hist(bins=30, alpha=0.7, color='steelblue')
plt.title(f"Histogram of 'Mean' — Well {subfolder.name}")
plt.xlabel("Mean Intensity")
plt.ylabel("Frequency")
plt.tight_layout()
output_fig = subfolder / "fig.png"
plt.savefig(output_fig, dpi=150)
plt.close() # 释放内存,防止图像叠加
print(f" ✅ Saved histogram: {output_fig}")
? 关键要点说明
- glob() 错误根源:原代码 glob.glob(i, "*.csv") 是错误调用——glob.glob() 只接受单个路径字符串(如 "folder/*.csv"),不支持两个参数。正确写法应为 glob.glob(os.path.join(i, "*.csv")) 或更推荐的 Path(i).glob("*.csv")。
- 路径安全拼接:pathlib 中 subfolder / "combined.csv" 自动处理路径分隔符(Windows/Linux/macOS 兼容),比字符串拼接 i + '/combined.csv' 更可靠。
-
健壮性增强:
- 使用 try/except 捕获读取失败(如损坏CSV、编码问题);
- 显式检查 'Mean' 列是否存在,避免 KeyError;
- 调用 plt.close() 防止内存泄漏或后续绘图重叠;
- 对空文件夹/无CSV情况友好提示,不中断整体流程。
-
扩展建议:
- 如需按特定命名规则筛选子文件夹(如 A1, B2),可用 root_dir.glob("A*") 或正则过滤;
- 可将绘图逻辑封装为函数,支持多列分析或自定义样式;
- 加入进度条(如 tqdm)提升大样本体验。
通过此方案,你只需运行一次脚本,即可全自动完成全部96个子文件夹的CSV合并、统计与可视化,输出文件严格保留在各自原始目录中,完全契合实验数据隔离管理需求。











