python读取CSV表格文件数据计算平均成绩并将数据写入新的表格中保存

本文介绍了如何使用Python的pandas库读取CSV文件,计算每位学生的平均成绩,并将结果保存到新的Excel文件中。同时,文章详细描述了在处理过程中遇到的常见问题,如数据格式错误和编码问题的解决方法。
摘要由CSDN通过智能技术生成

一、准备CSV源数据文件

CSV文件中数据类似如图所示结构:

数据特点:

1)每位学生会有多条记录,记录课程、成绩等信息(统计时需要根据学号进行去重);
2)计算平均成绩时,需要保留2位小数,但是不需要进行四舍五入;
3)每位学生选修的科目数量不一样,需要自己根据每位学生的记录数进行计算;

在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、实现代码(仅供参考,具体场景不同,需灵活变通)

import pandas as pd
import math,xlrd,base64
from openpyxl import Workbook

# python读取CSV表格文件数据,并根据姓名进行筛选去重
# 计算平均分,并将结果数据保存在新的表格中,每位学生的选修科目数是不一样的,需要进行一个count
# 平均分需要保留小数点后2位,不需要进行四舍五入
# 新表格中需要有学号、姓名、平均成绩、排名这几个必要项

# 计算平均成绩并将数据保留两位小数,但不进行四舍五入。利用":.2f".format(number)的形式会进行四舍五入
def truncate_decimal(total_score,count_row):
    number=total_score/count_row
    return math.floor(number*100)/100

# 过滤出学生姓名
def info_studentName(studentName):
    findName=''
    for value in studentName:
         print("studentName=", value)
         findName = value
    return findName

# 计算每位同学大学期间各科的平均成绩,并返回一个list存储数据
def result_student_message(folder_path,file_name):
    # 拼接csv源文件的路径,作为数据源
    path=folder_path+file_name
    # 读取CSV数据文件中的信息
    data=pd.read_csv(path,error_bad_lines=False,encoding='gbk')
    unique_students=data['学号'].drop_duplicates() #根据学号进行去重
    message=[] # message用于存放表格中,每位同学的学号、姓名、平均成绩信息
    fist_line = ["学号", "姓名", "平均成绩"]
    message.append(fist_line)

    for student in unique_students:
        # 获取学生所在行的数据
        student_data=data[data['学号']==student]
        #print("获取学生所在行的数据student_data",student_data)
        # 计算学号对应的学生各科数据条数,实际表格中相当于该学生对应的课程数目
        count_row = len(student_data)
        # 获取该学生总评成绩一栏的所有数据值,即为总成绩
        total_score=sum(student_data['总评成绩'])
        # 调用函数truncate_decimal(total_score,count_row)计算该同学的平均成绩
        average_score = truncate_decimal(total_score,count_row)
        # 找到学号对应的学生姓名
        studentName_list = student_data['姓名'].drop_duplicates()
        studentName=info_studentName(studentName_list)
        # 将对应学生的数据、计算的平均分等基本信息保存在字典中
        student_list=[]
        student_list.append(student)
        student_list.append(studentName)
        student_list.append(average_score)
        print("student_list:", student_list)
        # 将表格中所有的学生信息存放在一个总的list中
        message.append(student_list)
    return message

# 将学生平均成绩写入新建的xls表格中
def save_file(message,folder_path):

    # 生成一个新的工作簿,用于保存结果数据
    myWorkbook = Workbook()
    # 激活当前工作簿
    save_message = myWorkbook.active
    # 将list中的数据写入表格文档
    for item in message:
        # 这里的item参数,均为list
        save_message.append(item)

    # 保存结果数据文件
    myWorkbook.save(folder_path+'\save_message.xls')
    print("文件保存成功!")

# 方法调用处,绝对路径作为参数,需要传给读取文件数据的方法、保存文件数据的方法中
folder_path=r"E:\tools\pycharm\PycharmProjects\untitled\test\scoreFile"
file_name=r"\ceshi.csv"
# 接收处理平均成绩后的每位学生数据信息
student_message=[]
student_message=result_student_message(folder_path,file_name)
#print("外部student_message:",student_message)
save_file(student_message,folder_path)

三、运行产生的xls新文件(保存处理后结果的数据)

在这里插入图片描述

四、调试过程中遇到的问题及解决办法

  1. pandas.read_csv(filePath) 方法来读取csv文件时,可能会出现错误:

ParserError:Error tokenizing data.C error:Expected 3 fields in line 305,saw 4.

原因:header只有三个字段名,但数据的第305行却出现了4个字段
(可能是该行数据包含了逗号,或者确实有四个部分),pandas不知道该如何处理。

解决办法:把第407行多出的字段删除,或者通过在read_csv方法中设置error_bad_lines=False来忽略这种错误:

pandas.read_csv(filePath,error_bad_lines=False,encoding=‘gbk’)

  1. 读取CSV文件时,请注意编码问题(数据量特别多的时候,若编码正确但运行程序时仍出现编码的错误提示,请检查CSV数据文件本身是否有乱码的情况):

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xf7 in position 0: invalid start byte

: python不四舍五入取小数点后两位原文链接(转载)
https://blog.51cto.com/u_16213304/7554094

:学习python过程中写给自己的记录,仅供记录和参考哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值