+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-04(1)

2019-06(2)

2019-07(2)

2019-08(87)

2019-09(90)

用Python实现一个课堂点名器(用Python将名单数据传入mysql数据库)

发布于2020-03-31 13:23     阅读(881)     评论(0)     点赞(19)     收藏(3)


0

1

2

3

4

5

6

7

8

9

一, 任务描述

实验要求:

  1. 以网工18名单为例,从外部文件导入学生信息,并将学生信息存入MySQL数据库,随机对班级所有同学进行点名;

  2. 判断未到学生是否有请假条,有则视为请假,无则视为旷课。

  3. 对点名结束后进入教室的学生将旷课改为迟到。

  4. 对中途离开课堂学生计为早退(需要考虑学生既是迟到又是早退的情况)。

  5. 将未到学生按照请假、旷课、迟到、早退四类分别存储在MySQL数据库中的四个表中。

  6. 从MySQL数据中读取请假、旷课、迟到、早退四类信息并分别展示。

二,设计方案

首先导入xlrd包,pandas包,random包,pymysql包。

定义函数student,输入读取Excel文件地址,从Excel文件读取学号和姓名,返回全体学生学号和姓名列表。

定义函数num:输入想要点名人数,返回点名人数。为了输入格式的完整。

定义函数dianming:输入函数student返回的列表学号,姓名,人数,进行随机点名,返回随机学号,姓名列表。

定义函数zaotui:输入列表学号,姓名,判断是否早退,返回早退学号,姓名列表。用于后面函数的调用。

定义函数puanduan1:输入函数dianming返回的学号,姓名,判断是否来了,返回点名期间早退和没来学号,姓名列表。里面调用函数zaotui函数用来返回没来的学号和姓名列表。

定义函数panduan2:输入列表学号,姓名, 向缺勤表和迟到表里插入数据 ,返回早退学号列表,用于判断点名期间没有请假条的人。里面也有函数zaotui用来返回早退的学号和姓名列表。

定义函数qingjia:输入函数puanduan1返回没来的列表学号,判断是否有请假条,有就将信息插入请假表中,没有就调用函数panduan2向缺勤表和迟到表里插入数据,返回点名期间没来并且早退学号,姓名列表。

定义函数data:输入学号,姓名列表和插入的sql语句,利用该函数将信息一个一个插入相应的表中。

主函数只要与数据库建立连接,建立四个空表,再调用相关函数即可。迟到表是在主函数中建立,并且主函数用try来捕捉异常,最后断开连接。

注:数据库的主机:localhost用户名:root密码:root数据库名:my01端口:3306

方案图:在我上一个博客里,大家可以看一下!

三, 程序代码

#导包
import xlrd                 #导入xlrd包,对Excel读取数据
import pandas as pd         #导入pandas包,用于对Excel操作
import random               #导入随机random模块
import pymysql              #导入pymysql包,对mysql数据库进行连接

#定义函数:从Excel文件读取学号和姓名,返回全体学号和姓名列表
def student(address):
    data = xlrd.open_workbook(address)
    table = data.sheet_by_name('Sheet1')    #选定页码1--(Sheet1).

    rowNum = table.nrows    #总行数
    colNum = table.ncols    #总列数
    a = []  # 获得学号
    b = []  # 获得姓名

    for y in range(colNum):  #自动索引学号(xuehao),姓名(name)
        if table.cell_value(0, y) == 'xuehao':
            for x in range(1, rowNum):
                vaule = table.cell_value(x, y)
                vaule = float(vaule)
                vaule = int(vaule)
                a.append(vaule)

        if table.cell_value(0, y) == 'name':
            for x in range(1, rowNum):
                vaule = table.cell_value(x, y)
                b.append(vaule)

    return a, b

#定义函数:输入想要点名人数:
def num():
    while True:
        s = input()
        if s.isdigit():  # 判断输入是否为数字,是(true),否(Flase)
            num = eval(s)
            if (0 <= num <= len(a)):
                return num
            else:
                print('超出人数(全班人数:{0})!请再次输入:'.format(len(a)), end='')
                continue
        else:
            print('请规范输入!再次输入点名人数(全班人数:{0}):'.format(len(a)), end='')
            continue

#定义函数:输入列表学号,姓名,人数,进行随机点名,返回随机学号,姓名列表
def dianming(a, b, num ):
    students = dict(zip(a,b))   #化为字典,便于后面查询
    d = []
    e = []
    c = random.sample(a, num)  # 从学号列表中随机抽取不同的元素
    for i in c:
        d.append(i)
        e.append(students[i])
    return d,e

#定义函数:输入列表学号,姓名,判断是否来了,返回点名期间早退和没来学号,姓名列表
def panduan1(a,b):
    students = dict(zip(a, b))  # 化为字典,便于后面查询
    c = []
    d = []
    f = []
    g = []
    for xuehao in a:
        print('学号为{0}的学生是否来了(来:1,没来:2):'.format(xuehao), end='')
        while True:
            x = input()
            if (x == '1'):
                c.append(xuehao)
                d.append(students[xuehao])
                break
            elif (x == '2'):
                f.append(xuehao)
                g.append(students[xuehao])
                break
            elif (x != '1' or x != '2'):
                print('请规范输入!再次输入:', end='')
                continue
    x = zaotui(c,d)
    y = x[0]
    z = x[1]
    return y,z,f,g

#定义函数:输入列表学号,姓名,判断是否早退,返回早退学号,姓名列表
def zaotui(a,b):
    students = dict(zip(a, b))  # 化为字典,便于后面查询
    c = []
    d = []
    for xuehao in a:
        print('学号为{0}的学生是否早退(是:1,否:2):'.format(xuehao), end='')
        while True:
            x = input()
            if (x == '1'):
                c.append(xuehao)
                d.append(students[xuehao])
                break
            elif (x == '2'):
                break
            elif (x != '1' or x != '2'):
                print('请规范输入!再次输入:', end='')
                continue
    return c,d

#定义函数:输入点名期间没来列表学号,创建请假表,迟到表,缺勤表,返回点名期间没来并且早退学号,姓名列表
def qingjia(a,b):
    students = dict(zip(a, b))  # 化为字典,便于后面查询
    c = []
    d = []
    f = []
    g = []
    for xuehao in a:
        print('学号为{0}的学生是否有请假条(有:1,没有:2):'.format(xuehao), end='')
        while True:
            x = input()
            if (x == '1'):
                c.append(xuehao)
                d.append(students[xuehao])
                break
            elif (x == '2'):
                f.append(xuehao)
                g.append(students[xuehao])
                break
            elif (x != '1' or x != '2'):
                print('请规范输入!再次输入:', end='')
                continue
    qingjia1 = 'insert into qingjia(xuehao,name) values(%s,%s)'
    data(c,d,qingjia1)
    print('请假表数据填写完成')
    x = panduan2(f,g)
    y = x[0]
    z = x[1]
    return y,z

#定义函数:输入点名期间没有请假条列表学号,姓名,创建缺勤和迟到名单,返回早退学号列表
def panduan2(a,b):
    students = dict(zip(a, b))  # 化为字典,便于后面查询
    c = []
    d = []
    f = []
    g = []
    j = []
    k = []
    for xuehao in a:
        print('学号为{0}的学生上课期间是否来了(是:1,否:2):'.format(xuehao), end='')
        while True:
            x = input()
            if (x == '1'):
                c.append(xuehao)
                d.append(students[xuehao])
                break
            elif (x == '2'):
                f.append(xuehao)
                g.append(students[xuehao])
                break
            elif (x != '1' or x != '2'):
                print('请规范输入!再次输入:', end='')
                continue
    chidao1 = 'insert into chidao(xuehao,name) values(%s,%s)'
    data(c,d,chidao1)
    print('迟到表数据填写完成')
    queqin1 = 'insert into queqin(xuehao,name) values(%s,%s)'
    data(f,g,queqin1)
    print('缺勤表数据填写完成')
    x = zaotui(c, d)
    y = x[0]
    z = x[1]
    return y,z

#定义函数:输入列表学号,姓名,sql语句(insert);为了向空表里插入数据
def data(a,b,table):
    c = dict(zip(a,b))
    d = c.items()
    for i in d:
        try:
            # 执行创建表
            cur.execute(table, i)
            #提交事务
            con.commit()
        except Exception as e:
            print(e)
            con.rollback()
            print('创建表失败')

#主函数
try:
    #创建连接数据库
    con = pymysql.connect(host='localhost',user='root',password='root',database='my01',port=3306)
    #创建游标对象
    cur = con.cursor()
    #编写创建表
    qingjia_table="""
        create table qingjia(
        xuehao int not null,
        name varchar(20) not null,
        primary key(xuehao)
        )
    """
    queqin_table="""
        create table queqin(
        xuehao int not null,
        name varchar(20) not null,
        primary key(xuehao)
        )
    """
    chidao_table="""
        create table chidao(
        xuehao int not null,
        name varchar(20) not null,
        primary key(xuehao)
        )
    """
    zaotui_table="""
        create table zaotui(
        xuehao int not null,
        name varchar(20) not null,
        primary key(xuehao)
        )
    """
    try:
        # 执行创建表
        cur.execute(qingjia_table)
        print('创建空请假表成功')
        cur.execute(queqin_table)
        print('创建空缺勤表成功')
        cur.execute(chidao_table)
        print('创建空迟到表成功')
        cur.execute(zaotui_table)
        print('创建空早退表成功')
    except Exception as e:
        print(e)
        print('创建表失败')

    #获取全班信息
    address = r'D:\网工18.xlsx'
    x = student(address)
    a = x[0]
    b = x[1]
    #确定要点名的人数
    print('请输入要点名的人数(全班人数:{0}):'.format(len(a)),end='')
    num1 = num()
    #确定随机点名名单
    x = dianming(a, b, num1)
    c = x[0]
    d = x[1]
    #上课前的第一次点名
    x = panduan1(c,d)
    e = x[0]        #早退1
    f = x[1]
    g = x[2]        #没来
    h = x[3]
    x = qingjia(g,h)
    i = x[0]        #早退2
    j = x[1]
    k = e + i       #总早退
    l = f + j
    zaotui1='insert into zaotui(xuehao,name) values(%s,%s)'
    data(k,l,zaotui1)
    print('早退表数据填写完成')
except Exception as e:
    print(e)
    print('运行失败!!')
finally:
    #关闭连接
    con.close()

四,测试截图

在这里插入图片描述

以下为各表数据:

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

五,所用知识

  1. data = xlrd.open_workbook(r’D:\li.xlsx’)先导入xlrd包,可以从Excel中读取数据,data代表该文件。

  2. table =data.sheet_by_name(‘Sheet1’)读取Excel中页码为‘Sheet1’的内容。

  3. rowNum = table.nrows 读取总行数
    colNum =table.ncols 读取总列数
    table.cell_value(x,y) 读取表x行y列的值

  4. random.sample(a, num) 从a中随机抽取num个元素。

  5. break,continue的使用;

  6. pymysql.connect(host=‘localhost’,user=‘root’,password=‘root’,database=‘my01’,port=3306)用于连接数据库的。

  7. cur = con.cursor() 用于创建游标对象

  8. cur.execute(table, sql) 用于对数据库命令的执行,table为表,sql为要执行的sql语句

  9. con.commit() 提交事务

  10. con.rollback() 将游标返回前面

  11. con.close() 关闭与数据库的连接,节省资源

  12. try语句捕获异常。

六,参考文献:

【1】
https://www.cnblogs.com/ilovepython/p/11068841.html 如何用xlrd包

【2】
https://www.shsxt.com/down/8468.htm
第214~220集如何安装mysql和学习如何创建,插入表中数据。

七,原创说明:

全部原创

八,个人说明:

本人自学Python,学习时间不长,所以写的代码有很多地方可以优化,请不吝赐教,欢迎在讨论区一起学习。

原文链接:https://blog.csdn.net/qq_45405176/article/details/105198318

0

1

2

3

4

5



所属网站分类: 技术文章 > 博客

作者:智慧星辰

链接: https://www.pythonheidong.com/blog/article/292164/47291fdecaf7c258bb13/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)