用Python实现一个简单课堂点名器V4

一、任务描述

1.以18级网工学生名单为例,从外部文件导入学生信息,并将学生信息存入MySQL数据库,随机对班级所有同学进行点名;
2. 判断未到学生是否有请假条,有则视为请假,无则视为旷课。
3. 对点名结束后进入教室的学生将旷课改为迟到。
4. 对中途离开课堂学生计为早退(需要考虑学生既是迟到又是早退的情况)。
5. 将未到学生按照请假、旷课、迟到、早退四类分别存储在MySQL数据库中的四个表中。
6. 从MySQL数据中读取请假、旷课、迟到、早退四类信息并分别展示。

二、方案

1.思路:首先建立学生名单表、请假学生名单表、迟到学生名单表、早退学生名单表、旷课学生名单表这五张表。开始点名,上课前点名下课后点名,总共进行两次点名。第一次点名判断学生是否请假,第一次点名未到,第二次点名到:迟到,第一次点名到,第二次点名未到:早退,第一次点名第二次点名都未到:旷课。四种类型数据处理完毕后,依次将数据存入MySQL数据库。
2.数据:调用openpyxl库,从外部文件“网工18学生名单.xlsx”导入数据,将导入的数据存放进booksheet等待下一步处理。
3.处理:若要完成随机对班级所有同学的点名,一是随机,先创建一个shuzi列表再用for in range 使其内存有80个数字,后调用random库,使用sample()对shuzi列表内80个数据进行随机抽取后再重新存如shuzi列表中。二是所有同学的姓名及学号,xh字符串用来存放循环遍历的同学学号;用append()函数将xh字符串增添入xhlb列表,xm字符串用来存放循环遍历的同学姓名;用append()函数将xm字符串增添入xmlb列表。利用zip()函数将xhlb和xmlb两个一维数组组合为一个二维数组。开始进行循环遍历,从shuzi列表中依次取出第一步处理的随机数进行第一次点名,“1”表示已到,“2”表示请假,其余表示未到,记录已到、未到、请假同学的名单。将请假学生的名单存放进空列表qjlb中,将已到学生的名单存放进空列表ztlb1中将未到学生的名单存放进空列表cdlb1、kklb1中。直至80次循环结束,结束循环遍历。从shuzi列表中依次取出处理过的随机数进行第二次点名,“1”表示已到,“2”表示请假,其余表示未到,记录已到、未到同学的名单。将已到学生的名单存放进空列表cdlb2中将未到学生的名单存放进空列表ztlb2、kklb2中。将cdlb1和cdlb2、ztlb1和ztlb2、kklb1和kklb2依次取交集存放入cdlb、ztlb、kklb
4.输出:第一次点名前,将18网工的名单存入MySQL数据库。第二次点名结束后,将qjlb、cdlb、ztlb、kklb存入MySQL数据库。再从MySQL数据库的请假、迟到、早退、旷课四个表中取出数据打印在屏幕上。

三、流程图在这里插入图片描述
四、代码
from openpyxl import load_workbook
import random
import pymysql

workbook = load_workbook('D:\\2238029330\\FileRecv\\网工18.xlsx') #名单从指定路径读入
booksheet =  workbook.active
xhlb = []
xmlb = []

conn = pymysql.connect(host='localhost',user='root',password='123456',database='student',port=3306)
cursor = conn.cursor()
cursor.execute('DROP TABLE IF EXISTS studentList')
#创建学生表
sql = """CREATE TABLE `studentList` (  
  `studentNo` varchar(20) not null,
  `studentName` varchar(20) not null,
  primary key(studentNo)
)
"""
cursor.execute(sql)
print('创建学生名单表成功')

cursor.execute('DROP TABLE IF EXISTS qingjiaList')
#创建请假学生表
sql = """CREATE TABLE `qingjiaList` (  
  `studentNo` varchar(20) not null,
  `studentName` varchar(20) not null,
  primary key(studentNo)
)
"""
cursor.execute(sql)
print('创建请假学生名单表成功')

cursor.execute('DROP TABLE IF EXISTS chidaoList')
#创建迟到学生表
sql = """CREATE TABLE `chidaoList` (  
  `studentNo` varchar(20) not null,
  `studentName` varchar(20) not null,
  primary key(studentNo)
)
"""
cursor.execute(sql)
print('创建迟到学生名单表成功')

cursor.execute('DROP TABLE IF EXISTS zaotuiList')
#创建早退学生表
sql = """CREATE TABLE `zaotuiList` (  
  `studentNo` varchar(20) not null,
  `studentName` varchar(20) not null,
  primary key(studentNo)
)
"""
cursor.execute(sql)
print('创建早退学生名单表成功')

cursor.execute('DROP TABLE IF EXISTS kuangkeList')
#创建旷课学生表
sql = """CREATE TABLE `kuangkeList` (  
  `studentNo` varchar(20) not null,
  `studentName` varchar(20) not null,
  primary key(studentNo)
)
"""
cursor.execute(sql)
print('创建旷课学生名单表成功')

for i in range(1,81): #依次将booksheet中的各列读入变量和列表
    xh = str(booksheet.cell(row=i, column=1).value)
    xhlb.append(xh)
    xm = booksheet.cell(row=i, column=2).value
    xmlb.append(xm)
    sql1 = "INSERT INTO studentList (studentNo,studentName) VALUES ('"+xh+"','"+xm+"')"  #将名单依次导入数据库
    cursor.execute(sql1)
    conn.commit()

qjlb = []
kklb1,kklb2 = [],[]
cdlb1,cdlb2 = [],[]
ztlb1,ztlb2 = [],[]
shuzi = []

for num in range(0,80):  #在shuzi中存入80个随机数
    shuzi.append(num)
shuzi = random.sample(shuzi,80)

z = list(zip(xhlb,xmlb)) #将学号和姓名列表合并为二维列表
print('第一次点名开始:')

for j in range(0,80): #第一次点名开始
    print("{0} {1}".format(xhlb[shuzi[j]],xmlb[shuzi[j]]))
    dianming = input("点名:(到了输入1,请假输入2): ")
    if dianming != '1':
        if dianming == '2':
            qjlb.append(z[shuzi[j]])
        else:
            cdlb1.append(z[shuzi[j]])
            kklb1.append(z[shuzi[j]])
    else:
        ztlb1.append(z[shuzi[j]])

print('点名结束,开始上课')
print('----------------------分隔线----------------------')
print('老师上课结束')
print("第二次点名开始")

for k in range(0,80): #第二次点名开始
    print("{0} {1}".format(xhlb[shuzi[k]],xmlb[shuzi[k]]))
    dianming = input("点名:(到了输入1,请假输入2): ")
    if dianming != '1':
        ztlb2.append(z[shuzi[k]])
        kklb2.append(z[shuzi[k]])
    elif dianming == '2':
        pass
    else:
        cdlb2.append(z[shuzi[k]])

cdlb = [i for i in cdlb1 if i in cdlb2] #重复三次两个列表取交集
ztlb = [i for i in ztlb1 if i in ztlb2]
kklb = [i for i in kklb1 if i in kklb2]

zzqjlb = [i for item in qjlb for i in item]
for i in zzqjlb:
    if i.isdigit():
        zancun = str(i)
    else:
        sql2 = "INSERT INTO qingjiaList (studentNo,studentName) VALUES ('"+zancun+"','"+i+"')"  # 将迟到名单依次导入数据库
        try:
            cursor.execute(sql2)
            conn.commit()
        except:
            conn.rollback()

zzcdlb = [i for item in cdlb for i in item]
for i in zzcdlb:
    if i.isdigit():
        zancun = str(i)
    else:
        sql3 = "INSERT INTO chidaoList (studentNo,studentName) VALUES ('"+zancun+"','"+i+"')"  # 将迟到名单依次导入数据库
        try:
            cursor.execute(sql3)
            conn.commit()
        except:
            conn.rollback()

zzztlb = [i for item in ztlb for i in item]
for i in zzztlb:
    if i.isdigit():
        zancun = str(i)
    else:
        sql4 = "INSERT INTO zaotuiList (studentNo,studentName) VALUES ('"+zancun+"','"+i+"')"  # 将迟到名单依次导入数据库
        try:
            cursor.execute(sql4)
            conn.commit()
        except:
            conn.rollback()

zzkklb = [i for item in kklb for i in item]
for i in zzkklb:
    if i.isdigit():
        zancun = str(i)
    else:
        sql5 = "INSERT INTO kuangkeList (studentNo,studentName) VALUES ('"+zancun+"','"+i+"')"  # 将迟到名单依次导入数据库
        try:
            cursor.execute(sql5)
            conn.commit()
        except:
            conn.rollback()

cursor.execute('select * from qingjiaList') #在数据库中查询请假学生信息
qingjiastudent_info = str(cursor.fetchall())
cursor.execute('select * from chidaoList')  #在数据库中查询迟到学生信息
chidaostudent_info = str(cursor.fetchall())
cursor.execute('select * from zaotuiList')  #在数据库中查询迟到学生信息
zaotuistudent_info = str(cursor.fetchall())
cursor.execute('select * from kuangkeList') #在数据库中查询旷课学生信息
kuangkestudent_info = str(cursor.fetchall())
conn.close()
#打印请假、迟到、早退、请假学生名单
print('请假同学名单:'+qingjiastudent_info)
print('迟到同学名单:'+chidaostudent_info)
print('早退同学名单:'+zaotuistudent_info)
print('旷课同学名单:'+kuangkestudent_info)
五、样例测试

第一次点名:
在这里插入图片描述
第二次点名:

在这里插入图片描述
学生名单:

在这里插入图片描述
请假学生名单:
在这里插入图片描述
迟到学生名单:
在这里插入图片描述
早退学生名单:
在这里插入图片描述
旷课学生名单:
在这里插入图片描述

六、用到的知识点
  1. openpyxl库
    load_work()打开一个xlsx文件
    workbook.active()获取当前活跃的sheet页

  2. random库
    random.sample():从指定序列中随机获取指定长度的片段,原有序列不会改变,有两个参数,第一个参数代表指定序列,第二个参数是需获取的片段长度,

  3. 列表
    lt=[] 定义空列表lt
    ls[i]=x 替换列表ls第i元素为x
    ls[i:j:k]=It 用列表lt替换ls切片后所对应元素子列表
    del ls[i] 删除列表ls中第i元素
    ls+=lt 更新列表ls,将列表lt元素增加到列表ls中
    ls.append(x) 在列表ls最后增加一个元素x
    ls.clear() 删除列表ls中所有元素
    ls.copy() 生成一个新列表,赋值ls中所有元素
    ls.insert(i,x) 在列表ls的第i位置增加元素x
    ls.pop(i) 将列表ls中第i位置元素取出并删除该元素

  4. MySQL数据库
    连接MySQL数据库:
    conn=pymysql.connect(host,user,password,database,port)
    使用cursor()方法获取操作游标:
    cursor = db.cursor()
    SQL 插入语句:
    sql = “”“INSERT INTO EMPLOYEE(FIRST_NAME,
    LAST_NAME, AGE, SEX, INCOME)
    VALUES (‘Mac’, ‘Mohan’, 20, ‘M’, 2000)”""
    try:
    执行sql语句
    cursor.execute(sql)
    db.commit()
    except:
    db.rollback()
    关闭数据库连接:
    conn.close()

  5. 循环语句
    在这里插入图片描述

  6. 参考资料:
    两个一维列表转二维列表:
    https://blog.csdn.net/wangxingfan316/article/details/81387652
    导入xlsx:
    https://blog.csdn.net/index20001/article/details/73844576/
    两个列表取交集:
    https://www.cnblogs.com/wr13640959765/p/9416184.html
    Python 操作 MySQL 数据库:
    https://www.runoob.com/python/python-mysql.html
    python获取mysql数据库数据:
    https://blog.csdn.net/weixin_30511039/article/details/95408134

七、代码原创新说明

代码为原创,可以借鉴,请勿照搬。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值