Python遍历文件:计算Baseline列Isc/Voc等指标的平均值
统计Baseline数据列平均值的解决方案
看起来你已经搭了初步的代码框架,不过目前的写法存在一些小问题(比如内层循环重复读取文件行,会导致后续循环读不到内容),我帮你完善一下代码,实现统计test_results.csv中Baseline数据的Isc、Voc、Imp、Vmp、FF和Pmp列的平均值:
完整代码实现
from MyClasses import TestResult def main(): test_file = "test_results.csv" # 一次性读取所有行并跳过表头,避免重复读取导致的文件指针问题 with open(test_file, 'r') as inputFile: lines = inputFile.readlines()[1:] # 跳过第一行表头 user = TestResult() # 初始化6个目标列的累加器,对应Isc、Voc、Imp、Vmp、FF、Pmp column_sums = [0.0] * 6 valid_count = 0 # 统计符合条件的Baseline数据行数 for line in lines: split_line = line.strip().split(",") # 替换成你实际的Baseline判断条件,比如你的代码里写的"Base..." if user.getTestSeq(split_line[1]) == "Baseline": valid_count += 1 # 遍历第4到第9列(索引4到9),转换为数值并累加 for col_idx in range(4, 10): try: # 转换为浮点数,避免字符串无法计算 value = float(split_line[col_idx]) column_sums[col_idx - 4] += value except ValueError: print(f"⚠️ 警告:行内容'{line.strip()}'的第{col_idx+1}列不是有效数值,已跳过该值") # 检查是否有有效数据 if valid_count == 0: print("❌ 未找到任何Baseline数据,请检查判断条件或文件内容") return # 定义列名,方便输出结果 column_names = ["Isc", "Voc", "Imp", "Vmp", "FF", "Pmp"] print("\n📊 Baseline数据各列平均值:") for name, total in zip(column_names, column_sums): average = total / valid_count # 保留4位小数,让结果更清晰 print(f"{name}: {average:.4f}") if __name__ == "__main__": main()
关键优化点说明
- 文件读取优化:改用
with open自动管理文件资源,并且一次性读取所有行,避免内层循环重复读取导致的文件指针到末尾、后续循环无内容的问题 - 数据校验:加入
try-except捕获数值转换异常,避免文件中存在非数值内容导致程序崩溃 - 清晰的结果输出:定义列名对应累加器,输出时直接关联列名和平均值,可读性更强
- 边界处理:增加了无有效数据的判断,避免除以0的错误
注意事项
- 请确保
user.getTestSeq(split_line[1])的返回值和你实际的Baseline标识一致,比如如果你的数据里是"Base...",记得把判断条件改成== "Base..." - 如果你的CSV文件使用的不是逗号作为分隔符,需要修改
split(",")为对应的分隔符(比如制表符split("\t"))
内容的提问来源于stack exchange,提问作者Ububtunoob
相关产品推荐
相关产品推荐

