You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于特定准则对多文件夹同名文件内容求平均的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')

关键修改说明

  1. 替换zip(*valid_values)的遍历逻辑,改为按最大长度的索引逐个遍历
  2. 对每个索引位置,仅收集该位置存在的数值,避免因列表长度不一致报错
  3. 增加空列表判断,防止无符合准则文件时出现计算错误

内容的提问来源于stack exchange,提问作者KeplerNick123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:57:47