Python如何从固定格式文本文件指定行分别计算两组数值的平均值
固定格式文本数值提取与平均值计算方案
核心思路说明
你提到的「将数据存入列表后计算」是完全可行的,也是普通场景下最推荐的方案,逻辑直观方便校验。如果处理的是GB级超大文件,也可以用边读边累加的方案节省内存,以下是两种具体实现方法:
方案1:标记位匹配法(推荐90%以上场景使用)
不需要预设文本块结构,容错性高,即使中间出现多余随机行也不会出错:
- 逐行读取文本,匹配到数值行后用标记位判断当前属于num1组还是num2组,交替存入两个列表
- 全部提取完成后直接计算列表的总和除以长度得到平均值
Python示例代码:
nums1 = [] nums2 = [] # 标记位:0表示下一个数值归num1组,1表示归num2组 num_flag = 0 with open("你的文件路径.txt", "r", encoding="utf-8") as f: for line in f: cleaned_line = line.strip() # 此处匹配规则根据你的实际数值行格式调整,示例为数值行固定以"num "开头 if cleaned_line.startswith("num "): current_val = int(cleaned_line.split()[1]) if num_flag == 0: nums1.append(current_val) num_flag = 1 else: nums2.append(current_val) num_flag = 0 # 计算平均值,增加空判断避免除以0报错 avg_num1 = sum(nums1) / len(nums1) if nums1 else 0 avg_num2 = sum(nums2) / len(nums2) if nums2 else 0 print(f"num1组平均值:{avg_num1:.2f}") print(f"num2组平均值:{avg_num2:.2f}")
如果你的数值行没有前缀、就是纯数字行,把匹配规则改成if cleaned_line.isdigit(),提取数值直接用int(cleaned_line)即可。
方案2:固定块读取法(适合超大文件场景)
如果你的文本格式100%固定,每5行是一个循环块、块内第2行是num1、第3行是num2,可以用边读边累加的方案,不需要存储所有数值,节省内存:
sum1 = count1 = sum2 = count2 = 0 # 每个循环块的固定行数 BLOCK_SIZE = 5 with open("你的文件路径.txt", "r", encoding="utf-8") as f: while True: # 一次读取一个块的行 block = [f.readline() for _ in range(BLOCK_SIZE)] # 读取到文件末尾就退出 if not any(block): break # 提取num1 val1 = int(block[1].strip().split()[1]) sum1 += val1 count1 += 1 # 提取num2 val2 = int(block[2].strip().split()[1]) sum2 += val2 count2 += 1 avg_num1 = sum1 / count1 if count1 else 0 avg_num2 = sum2 / count2 if count2 else 0
内容的提问来源于stack exchange,提问作者GrimOutlook77
相关产品推荐
相关产品推荐

