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

