一、任務描述
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)
五、樣例測試
第一次點名:
第二次點名:
學生名單表:
請假學生名單表:
遲到學生名單:
早退學生名單:
曠課學生名單:
六、用到的知識點
-
openpyxl庫
load_work()打開一個xlsx文件
workbook.active()獲取當前活躍的sheet頁 -
random庫
random.sample():從指定序列中隨機獲取指定長度的片段,原有序列不會改變,有兩個參數,第一個參數代表指定序列,第二個參數是需獲取的片段長度, -
列表
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位置元素取出並刪除該元素 -
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() -
循環語句
-
參考資料:
兩個一維列表轉二維列表:
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
七、代碼原創新說明
代碼爲原創,可以借鑑,請勿照搬。