基于特定准则对多文件夹同名文件内容求平均的Python问题
问题:多文件夹同名文件内容按准则求平均值(保留长文件后续元素)
问题背景
需要用Python实现:扫描多个包含同名文件的文件夹,仅对满足min(numbers) <= k * max(numbers)准则的文件内容计算平均值,要求保留较长文件的后续元素(当前代码仅计算到最短文件的长度,与预期不符)。
现有代码
import os NFILES = 3 values = [[] for _ in range(NFILES)] k = 0.5 # fraction of initial number of invaded pores K = 1.0e3 Cb0 = 0.001 DiffCoeff = 1e-8 for i in range(NFILES): filepath = rf"C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Basics\Averaged_Testing\{i}\len_J_{K}_{Cb0}_{DiffCoeff}.txt" if os.path.isfile(filepath): with open(filepath) as data: lines = data.readlines() numbers = [float(line.strip()) for line in lines if line.strip().isdigit()] if numbers and min(numbers) <= k * max(numbers): values[i].extend(numbers) print("Folder numbers which meet the criterion =", i) valid_values = [v for v in values if v] # Remove empty lists print("Total number of folders which meet the criterion =", len(valid_values)) max_length = max(len(inner_list) for inner_list in valid_values) averaged_values = [] for sublist in zip(*valid_values): sublist_avg = sum(sublist) / len(valid_values) averaged_values.append(sublist_avg) print("Averaged values:") for avg_value in averaged_values: print(avg_value) with open(rf"C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Basics\Averaged_Testing\Averaged_{k}__{K}_{Cb0}_{DiffCoeff}_{NFILES}files.txt", 'w') as f: for avg_value in averaged_values: f.write(str(avg_value) + '\n')
文件内容
- 文件夹1的文件内容:
405 405 400 311 105 35 14 4 3 3
- 文件夹2的文件内容:
411 411 393 139 35 8 0
当前输出 vs 期望输出
- 当前输出(仅计算到最短文件长度):
408.0 408.0 396.5 225.0 70.0 21.5 7.0
- 期望输出(保留长文件后续元素,仅取存在的数值计算):
408.0 408.0 396.5 225.0 70.0 21.5 14.0 4.0 3.0 3.0
解决方案
问题核心在于zip(*valid_values)仅会迭代到最短列表的长度。改为按最大长度遍历每个索引位置,收集该位置所有存在的数值后再计算平均值即可解决。
修改后的代码
import os NFILES = 3 values = [[] for _ in range(NFILES)] k = 0.5 # 初始侵入孔隙数的比例 K = 1.0e3 Cb0 = 0.001 DiffCoeff = 1e-8 for i in range(NFILES): filepath = rf"C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Basics\Averaged_Testing\{i}\len_J_{K}_{Cb0}_{DiffCoeff}.txt" if os.path.isfile(filepath): with open(filepath) as data: lines = data.readlines() numbers = [float(line.strip()) for line in lines if line.strip().isdigit()] if numbers and min(numbers) <= k * max(numbers): values[i].extend(numbers) print("符合准则的文件夹编号 =", i) valid_values = [v for v in values if v] # 移除空列表 print("符合准则的文件夹总数 =", len(valid_values)) if not valid_values: print("没有符合准则的文件") exit() max_length = max(len(inner_list) for inner_list in valid_values) averaged_values = [] for idx in range(max_length): # 收集当前索引下所有存在的数值 current_values = [] for sublist in valid_values: if idx < len(sublist): current_values.append(sublist[idx]) # 计算平均值 sublist_avg = sum(current_values) / len(current_values) averaged_values.append(sublist_avg) print("平均值结果:") for avg_value in averaged_values: print(avg_value) with open(rf"C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Basics\Averaged_Testing\Averaged_{k}__{K}_{Cb0}_{DiffCoeff}_{NFILES}files.txt", 'w') as f: for avg_value in averaged_values: f.write(str(avg_value) + '\n')
关键修改说明
- 替换
zip(*valid_values)的遍历逻辑,改为按最大长度的索引逐个遍历 - 对每个索引位置,仅收集该位置存在的数值,避免因列表长度不一致报错
- 增加空列表判断,防止无符合准则文件时出现计算错误
内容的提问来源于stack exchange,提问作者KeplerNick123
相关产品推荐
相关产品推荐

