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

Python实现CSV指定行平均值计算(无Pandas)及索引错误排查

解决CSV每行平均值计算的IndexError问题

问题描述

我熟悉C语言,刚接触Python,需要编写仅使用csv模块、不借助Pandas的代码,读取CSV文件计算每行(1-31行,行数可变)的平均值。但运行代码时始终出现IndexError: list index out of range错误,附上现有代码及CSV示例数据。

现有代码

with open("RADIOLOGY.csv") as file:
    data = file.readlines()


def compute_averages(data):
    if not data:
        return []

    # num_months = len(data[0:].split()) - 1  # Calculate the number of months
    num_months = len([row.split()[0] for row in data])
    print(num_months)
    print(len(data))
    # averages = [1] * num_months
    averages = []

    for row in data:
        values = row.split()
        for i in range(num_months):
            if i < len(values) - 1:
                averages[i] += float(values[i - 1])

    for i in range(num_months):
        averages[i] /= len(data)

    return averages


def driver():

    if len(data) < 1:
        print("Not enough data to compute averages.")
        return

    # Assuming the first row contains headers and the first column contains observations
    headers = data[0].split()
    observations = [row.split()[0] for row in data]

    averages = compute_averages(data)

    print(f"Number of months: {len(headers) - 1}")
    print("Averages for each observation:")
    for i, observation in enumerate(observations):
        print(f"{observation}: {averages[i]}")


if __name__ == "__main__":
    driver()

CSV示例数据

1   2317    5327    997 986
2   2605    5617    1085    1105
3   2364    5490    1061    998
4   2975    6236    1129    1164
5   2766    5877    1206    1104
6   2762    6058    1295    908
7   3020    6602    1274    1089
8   2576    5644    1091    1041
9   3329    6643    1396    1130
10  2989    6284    1330    1192

错误原因排查

  • 逻辑偏离需求:你需要计算每行的平均值,但原代码错误地在计算每列的平均值,索引处理完全混乱。
  • 列表初始化错误:averages被初始化为空列表,直接通过averages[i] += ...访问索引会触发IndexError——空列表没有对应索引的元素。
  • 索引计算错误:values[i - 1]当i=0时会取values[-1](最后一个元素),完全不符合数值累加的逻辑。
  • 未使用csv模块:原代码用readlines()+split()处理CSV,不符合你要求的仅使用csv模块的规范,且对复杂CSV(如含逗号/引号的情况)处理容易出错。

修正后的代码(符合需求+使用csv模块)

import csv

def compute_row_averages(file_path):
    averages = []
    with open(file_path, 'r') as file:
        # 示例数据是制表符分隔,若为逗号分隔则改为delimiter=','
        reader = csv.reader(file, delimiter='\t')
        for row_num, row in enumerate(reader, start=1):
            if not row:
                continue  # 跳过空行
            # 跳过第一个元素(行号),将剩余元素转为float计算平均值
            try:
                numeric_values = [float(num) for num in row[1:]]
                if numeric_values:
                    row_avg = sum(numeric_values) / len(numeric_values)
                else:
                    row_avg = 0.0
                averages.append((row[0], row_avg))
            except ValueError as e:
                print(f"第{row_num}行数据格式错误:{e}")
                averages.append((row[0], None))
    return averages

def driver():
    row_averages = compute_row_averages("RADIOLOGY.csv")
    if not row_averages:
        print("没有足够数据计算平均值。")
        return
    print("每行的平均值:")
    for row_id, avg in row_averages:
        if avg is not None:
            print(f"行{row_id}: {avg:.2f}")
        else:
            print(f"行{row_id}: 计算失败")

if __name__ == "__main__":
    driver()

代码说明

  • 用csv.reader读取文件,根据实际CSV的分隔符调整delimiter参数(示例是制表符,逗号分隔则改',')。
  • 逐行处理:跳过每行第一个元素(行号),将剩余数值转成float后计算平均值。
  • 增加异常处理,避免因数据格式错误导致程序崩溃。
  • 返回结果包含行号和对应平均值,输出更直观清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:15:55