- 任务描述:
用Python实现一个简单课堂点名器V4
要求:
(1). 以18级网工学生名单为例,从外部文件导入学生信息,并将学生信息存入MySQL数据库,随机对班级所有同学进行点名;
(2). 判断未到学生是否有请假条,有则视为请假,无则视为旷课。
(3). 对点名结束后进入教室的学生将旷课改为迟到。
(4). 对中途离开课堂学生计为早退(需要考虑学生既是迟到又是早退的情况)。
(5). 将未到学生按照请假、旷课、迟到、早退四类分别存储在MySQL数据库中的四个表中。
(6). 从MySQL数据中读取请假、旷课、迟到、早退四类信息并分别展示。
(经老师同意,数据库采用SQL Sever)
- 方案:
此代码分为7个部分,下面依次介绍(姓名列表和学号列表内容一一对应):
(1) import导用xlrd、pymssql、random;
(2) 创建InputInformation函数,运用xlrd库内容用for循环和table.cell_value()读取本地csv文件内容,用INSERT INTO * 写入到数据库中;
(3) 创建SignIn_ALL函数,进行初步的点名签到处理:创建StudentName_SignIn_list列表和 StudentNumber_SignIn_list列表。用while循环构造随机数组成的集合set,转为list,for循环进行点名处理,对未到的学生记录到StudentName_SignIn_list中,并依据StudentNumber_list获取该学生的学号记录到StudentNumber_SignIn_list中,return返回StudentName_SignIn_list, StudentNumber_SignIn_list后期需要对此处理;
(4) 创建SignIn_paper函数,对写了请假条的学生进行处理:创建student_paper接受拥有请假条的学生的姓名,while循环处理,if语句判断是否在StudentName_SignIn_list(初步签到未到学生名单)中,若在则用list.insert()放入新创建的list_student_paper(储存有请假条学生的姓名)列表中,用list.index()找出所在StudentName_SignIn_list列表中的位置赋值给address,用list.pop()方法删去所在StudentName_SignIn_list列表和StudentNumber_SignIn_list列表对应位置内容(为有请假条学生的姓名和学号),用list.index()找出所在StudentName_list列表中的位置赋值给address2,用list.insert()方法将该学生的学号放入新创建的list_studentNumber_paper(储存有请假条学生的学号)列表中。处理结束调用INSERT INTO * 写入到数据库中;
(5) 创建SignIn_chidao函数,过程类似SignIn_paper函数,处理结果:list_student_chidao储存迟到学生姓名,list_studentNumber_chidao储存迟到学生的学号,展示并调用InputInformation_File函数存储;此时StudentName_SignIn_list列表和StudentNumber_SignIn_list列表中存储的为旷课学生(=全班学生-签到学生-迟到学生-请假学生)的姓名和学号调用调用INSERT INTO * 写入到数据库中;
(6) 创建SignIn_zaotui函数,过程类似SignIn_paper函数,处理结果:list_studentName_zaotui记录早退学生姓名,list_studentNumber_zaotui记录早退学生学号处理结束调用调用INSERT INTO * 写入到数据库中;
(7) 主函数:一次运行InputInformation函数读取数据,SignIn_ALL函数并将return结果給part1,用part1[1]和part1[0]储存初处理的学生学号和姓名,SignIn_paper函数统计请假学生,SignIn_chidao函数统计迟到学生,SignIn_zaotui函数统计早退学生。添加for循环,导用select语句对数据库中的内容进行展示。
- 代码:
import xlrd
import pymssql
import random
def InputInformation(StudentName_list, StudentNumber_list):
print("正在导入学生信息:")
path = 'E:/test/testxlrd.csv'
data = xlrd.open_workbook(path)
table = data.sheets()[0]
for i in range(1, table.nrows):
StudentNumber_list.append(table.cell_value(i, 1))
StudentName_list.append(table.cell_value(i, 2))
print("正在写入数据库student_list:")
conn = pymssql.connect(host='localhost', server='******', port='****', user='sa',
password='******', database='pythonDB')
cursor = conn.cursor()
cursor.execute("""
IF OBJECT_ID('student_list', 'U') IS NOT NULL
DROP TABLE student_list
CREATE TABLE student_list (
id INT NOT NULL,
name VARCHAR(100),
number INT,
PRIMARY KEY(id)
)
""")
for i in range(1, table.nrows):
cursor.executemany(
"INSERT INTO student_list VALUES (%d, %s, %d)",
[(i, StudentName_list[i - 1], StudentNumber_list[i - 1])])
conn.commit()
conn.close()
def SignIn_ALL(StudentName_list, StudentNumber_list):
print