Python实现多文件夹多图像的像素强度数据导出至Excel
解决Pandas导出多文件夹数据仅保留最后一项的问题
问题原因
你原来的代码在循环遍历文件夹时,每次计算出的ratios都会覆盖上一次的结果,最后只有最后一个文件夹的ratios被存入DataFrame,自然就丢失了前面所有文件夹的数据。
修复方案
我们需要先把每个文件夹的ratios收集到一个统一的列表中,再将这个列表转换为DataFrame——这样每个文件夹的比值列表就会对应Excel里的单独一行。如果不同文件夹的图片数量不一样,Pandas会自动用NaN填充空缺的位置,保证格式整齐。
修改后的完整代码
import os import matplotlib.pyplot as plt import skimage.external.tifffile as tiff import pandas as pd from pandas import DataFrame # 读取文件夹中的所有tif图像 def load_images_from_folder(folder): images = [] # 按文件名排序,保证延时摄影的时间点顺序正确 for filename in sorted(os.listdir(folder)): if filename.endswith('.tif'): img = tiff.imread(os.path.join(folder, filename)) if img is not None: images.append(img) return images folders = [ 'path to folder1', 'path to folder2', 'path to folder3', ] # 初始化列表,用来存储所有文件夹的比值数据 all_ratios = [] # 存储文件夹名称,方便后续识别每行对应的文件夹 folder_names = [] for folder in folders: images = load_images_from_folder(folder) # 计算绿通道均值/红通道均值的比值列表 ratios = [image[..., 1].mean() / image[..., 0].mean() for image in images] plt.plot(range(len(images)), ratios) plt.title(os.path.basename(folder)) # 给每个折线图加上文件夹名称,方便区分 plt.show() # 将当前文件夹的比值列表加入总列表 all_ratios.append(ratios) # 记录文件夹名称 folder_names.append(os.path.basename(folder)) # 将收集到的所有数据转换为DataFrame,每行对应一个文件夹 # 用文件夹名称作为行索引,让Excel数据更直观 df = pd.DataFrame(all_ratios, index=folder_names) # 给列命名为"时间点1"、"时间点2"...,便于理解每个列对应的拍摄时间 df.columns = [f'时间点{i+1}' for i in range(df.shape[1])] # 导出到Excel df.to_excel('Ratios.xlsx', sheet_name='sheet1')
关键修改点说明
- 新增
all_ratios列表,用来累积每个文件夹的比值数据,避免被循环覆盖 - 新增
folder_names列表,记录每个文件夹的名称并作为DataFrame的行索引,让Excel里的数据一目了然 - 对
os.listdir的结果做了sorted()排序——延时摄影的文件通常按时间编号,排序后能保证比值列表的顺序和实际拍摄时间完全对应(这一步很容易被忽略,但对数据准确性至关重要) - 导出的DataFrame每行对应一个文件夹,每列对应一个时间点的比值,空缺位置自动填充
NaN,保证表格格式整齐
这样修改后,你打开Excel就能看到每个文件夹的比值列表单独占一行啦!
内容的提问来源于stack exchange,提问作者JurgK
相关产品推荐
相关产品推荐

