python读取CSV表格文件数据计算平均成绩并将数据写入新的表格中保存(demo,写给自己的仅供记录和参考)
一、准备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新文件(保存处理后结果的数据)
四、调试过程中遇到的问题及解决办法
- 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’)
- 读取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过程中写给自己的记录,仅供记录和参考哦。