Pandas存储文件夹大小统计结果时每行索引均为0问题求解
问题原因
两个核心问题导致你遇到的现象:
- 你在每次调用
show_folders_by_size时,都会在函数内部重新初始化空的path、calcul_size列表,并且新建一个独立的DataFrame,每个DataFrame里只存入当前遍历到的1个文件夹的数据,所以每个表都只有1行,默认索引自然都是0。且函数执行结束后内部生成的DataFrame会被直接回收,根本没有实现多文件夹结果的汇总。 - 附带逻辑bug:你当前的大小计算逻辑只统计目标文件夹下的直接子项大小,没有递归遍历子文件夹,统计出的目录大小是不准确的;同时主循环里
os.walk(root)的参数和循环接收的根目录变量重名,容易引发逻辑错误。
修复方法
核心思路是把「单文件夹统计」和「结果汇总建表」两个逻辑拆分:
- 调整统计函数,让它只负责计算单个文件夹的大小、返回单条统计数据,不在函数内部创建DataFrame
- 在主程序外层初始化统一的结果存储列表,遍历所有目标文件夹时把每条统计结果追加到这个列表中
- 等所有文件夹遍历完成后,用汇总好的列表一次性创建DataFrame,即可得到包含所有结果、索引连续的完整表格
- 可选:补全文件夹大小的递归统计逻辑,修正主循环的变量命名冲突
修复后的可运行代码如下:
import os import time import pandas as pd # 单文件夹大小计算函数,支持递归统计子文件 def get_folder_size(folder_path): total_size = 0 for item in os.scandir(folder_path): if item.is_file(): total_size += item.stat().st_size elif item.is_dir(): total_size += get_folder_size(item.path) # 单位转换为Mb return total_size // 1048576 if __name__ == "__main__": # 替换为你实际要扫描的根目录,注意不要和os.walk的循环变量重名 SCAN_ROOT = r"C:\Users\mbarrech\Desktop\dossier_test" expire_threshold = time.time() - (3 * 2628000) # 统一存储所有结果的列表 all_dev_folder = [] for current_root, dirs, files in os.walk(SCAN_ROOT): for dir_name in dirs: dir_full_path = os.path.join(current_root, dir_name) if "back" in dir_name: # 保留你原有的过期文件清理逻辑 remove_files_by_modification_time(dir_full_path) elif "dev" in dir_name: size_mb = get_folder_size(dir_full_path) all_dev_folder.append({ "chemin du dossier": dir_full_path, "taille par Mb": f"{size_mb} Mb" }) # 所有数据收集完成后统一生成DataFrame df_dev_size = pd.DataFrame(all_dev_folder) # 打印验证结果 print(df_dev_size)
运行后生成的df_dev_size会包含所有匹配到的dev文件夹信息,索引自动从0开始连续递增,不会再出现单条数据单独成表、索引全为0的问题。
如果你不需要统计子文件夹的大小,只需要计算目标文件夹下直接子项的大小,把get_folder_size里递归调用的部分删除即可,核心的结果汇总逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Mehdi Barrech
相关产品推荐
相关产品推荐

