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
相关产品推荐
相关产品推荐

