Python零导入无库处理CSV:计算指定列的最大值、最小值、平均值
原生Python无第三方库处理CSV计算列统计值方案
功能说明
无需导入任何第三方库,仅用Python原生语法即可实现CSV指定列的最大值、最小值、平均值计算,支持两种输出形式。
现有代码问题修复
你提供的现有代码存在两处核心逻辑错误,可直接参考下方完整实现:
- 缩进错误:
rows.append(row)放置在列循环内部,导致同一行数据被重复追加 - 统计逻辑错误:固定取第一列计算最值,无法匹配多列或指定列统计需求
实现代码
第一种输出:直接打印指定列统计结果
# 可按需修改目标列名和CSV路径 target_column = "TASK1" csv_file_path = "file.csv" with open(csv_file_path, "r", encoding="utf-8") as f: # 匹配目标列索引 headers = f.readline().strip().split(",") if target_column not in headers: raise ValueError(f"不存在列:{target_column}") col_index = headers.index(target_column) # 收集目标列所有数值 value_list = [] for line in f: line = line.strip() if not line: continue columns = line.split(",") value_list.append(int(columns[col_index])) # 计算统计值 max_value = max(value_list) min_value = min(value_list) avg_value = sum(value_list) / len(value_list) # 输出结果示例 print(f"Average of {target_column} is {avg_value}") # 如需输出最值可取消注释下方代码 # print(f"Max of {target_column} is {max_value}") # print(f"Min of {target_column} is {min_value}")
运行后输出效果:
Average of TASK1 is 60.4
第二种输出:原CSV末尾追加统计行
csv_file_path = "file.csv" # 可按需增删要展示的统计项,示例仅保留平均值 stat_items = ["AVG"] with open(csv_file_path, "r", encoding="utf-8") as f: # 读取原文件所有内容 origin_lines = [line.strip() for line in f if line.strip()] headers = origin_lines[0].split(",") # 需统计的数值列总数(跳过第一列ID) stat_col_total = len(headers) - 1 # 收集所有数值列数据 column_values = [[] for _ in range(stat_col_total)] for line in origin_lines[1:]: cols = line.split(",") for i in range(stat_col_total): column_values[i].append(int(cols[i+1])) # 生成统计行 stat_rows = [] for item in stat_items: row = [item] for idx in range(stat_col_total): if item == "AVG": avg = sum(column_values[idx])/len(column_values[idx]) # 保留1位小数,和示例输出格式对齐 row.append(f"{avg:.1f}" if avg %1 !=0 else f"{int(avg)}") elif item == "Max": row.append(f"{max(column_values[idx])}") elif item == "Min": row.append(f"{min(column_values[idx])}") # 补全空列保证格式对齐 row += [""]*(len(headers)-len(row)) stat_rows.append(",".join(row)) # 合并输出原内容+统计行 result = "\n".join(origin_lines + stat_rows) print(result) # 如需覆盖写入原文件,可取消下方注释 # with open(csv_file_path, "w", encoding="utf-8") as f: # f.write(result)
运行后输出效果:
ID,TASK1,TASK2,QUIZ1,QUIZ2 11061,50,75,50,78 11062,70,80,60,50 11063,60,75,77,79 11064,52,85,50,80 11065,70,85,50,80 AVG,60.4,80.0,57.4,73.4
如果仅需要TASK1列的统计值,其余留空,可修改生成统计行的逻辑,仅给对应索引位置赋值即可。
内容的提问来源于stack exchange,提问作者FAISHAL YUSUF BAQIR
相关产品推荐
相关产品推荐

