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

如何用Python累加文件夹中TXT文件数值并计算平均值

Python文本文件数值统计与平均值计算问题修复

需求说明

需要完成以下操作:

  • 打开指定文件夹
  • 查找其中的.txt格式文件
  • 打开找到的文件
  • 读取每个文件的每一行并累加数值
  • 仅读取每个文件的前5行进行累加
  • 将每行的累加值除以文件数量得到平均值
  • 将结果写入同一目录下的finish.txt文件

原问题代码

用户编写的代码无法正常运行,原代码如下:

import os
path = str(os.path.dirname(__file__))+"\\files"
os.chdir(path)
def sl (fp):
    path = str(os.path.dirname(__file__))+"\\files"
    L=len([name for name in os.listdir(path) if 
os.path.isfile(os.path.join(path, name))])
    if L:
        if file.endswith(".txt"):
            Length=L
        else:
            Length=1
    finish=open(os.path.dirname(__file__)+"\\finish.txt", 
"w")
    Sum1=0
    Sum2=0
    Sum3=0
    Sum4=0
    Sum5=0
    with open(file_path, 'r') as fp:
        line_numbers = [0, 1, 2, 3, 4]
        lines = []
        for i, line in enumerate(fp):
            if i in line_numbers:
                lines.append(line.strip())
                if i==0:
                    Sum1+=int(line)
                if i==1:
                    Sum2+=int(line)
                if i==2:
                    Sum3+=int(line)
                if i==3:
                    Sum4+=int(line)
                if i==4:
                    Sum5+=int(line)
            elif i > 4:
                break
        Write=str(int(Sum1/Length))+"\n"+str(int(Sum2/Length))+"\n"+str(int(Sum3/Length))+"\n"+str(int(Sum4/Length))+"\n"+str(int(Sum5/Length))+"\n"

finish.write(Write+str((Sum1+Sum2+Sum3+Sum4+Sum5)/Length))
        finish.close()
    # iterate through all file
    for file in os.listdir():
    # Check whether file is in text format or not
    if file.endswith(".txt"):
        file_path = f"{path}\\{file}"
        sl(file_path)

代码问题分析

  1. 变量作用域错误:函数sl中使用的file、file_path未定义,参数fp未被使用
  2. 文件数量统计错误:原代码统计目录下所有文件,而非仅.txt文件
  3. 文件写入逻辑错误:每次调用sl都会重新打开finish.txt并覆盖内容,导致最终只保留最后一个文件的计算结果
  4. 累加逻辑冗余:使用5个独立变量存储每行累加值,代码冗余且扩展性差
  5. 缩进错误:循环和条件语句的缩进不符合Python语法规范,会导致运行报错
  6. 路径处理不规范:硬编码反斜杠\\,跨平台兼容性差,应使用os.path.join

修复后的解决方案

以下是重构后的代码,解决了上述问题,逻辑更清晰:

import os

# 获取脚本所在目录下的files文件夹路径
root_dir = os.path.dirname(__file__)
target_dir = os.path.join(root_dir, "files")
finish_path = os.path.join(root_dir, "finish.txt")

# 初始化前5行的累加值,用列表更简洁
line_sums = [0] * 5
txt_file_count = 0

# 遍历目标文件夹下的所有文件
for filename in os.listdir(target_dir):
    if filename.endswith(".txt"):
        txt_file_count += 1
        file_path = os.path.join(target_dir, filename)
        # 打开文件读取前5行
        with open(file_path, 'r', encoding='utf-8') as f:
            for line_idx, line in enumerate(f):
                if line_idx >= 5:
                    break
                # 去除换行符并转换为整数累加
                try:
                    num = int(line.strip())
                    line_sums[line_idx] += num
                except ValueError:
                    # 如果行内容不是整数,跳过该行
                    print(f"文件{filename}的第{line_idx+1}行不是有效整数,已跳过")

# 计算平均值(避免除以0的情况)
if txt_file_count == 0:
    print("未找到任何txt文件")
else:
    line_avgs = [sum_val / txt_file_count for sum_val in line_sums]
    total_avg = sum(line_sums) / (txt_file_count * 5)

    # 将结果写入finish.txt
    with open(finish_path, 'w', encoding='utf-8') as f:
        # 写入每行的平均值
        for idx, avg in enumerate(line_avgs, 1):
            f.write(f"第{idx}行平均值: {avg}\n")
        # 写入总平均值
        f.write(f"所有数值总平均值: {total_avg}\n")
    print("计算完成,结果已写入finish.txt")

代码说明

  • 使用os.path.join处理路径,保证跨平台兼容性
  • 用列表line_sums存储前5行的累加值,代码更简洁易维护
  • 增加异常处理,避免文件中存在非整数内容导致程序崩溃
  • 先收集所有文件的累加数据,最后统一写入结果文件,避免覆盖问题
  • 处理了无txt文件的边界情况,避免除以0错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:30:47