前言
還是一樣,又來了新的需求
這裏我們就要用到Python連接MySQL的相關模塊了。
Python連接MySQL的模塊我們這裏選用pymysql
,自己這兩個庫東西挺多的,自己分別寫了博文記載自己用到的部分:
Python連接MySQL(
pymysql
):
https://blog.csdn.net/Ans_min/article/details/105186069
思路
這次相對V3就是單純的加了MySQL的鏈接,我們導入pymysql模塊、改寫dmq_file_in
那四個函數(dmq_file_in_late
、dmq_file_in_absence
、dmq_file_in_sick
和dmq_file_in_early
),再在dmq_init
函數裏添加連接數據庫部分就可以了,這部分我們取名爲data_in
。
自己修改了一下V3的思路圖:
新加的在圖中都以紅色和黃底表示了出來。
代碼
我們貼出代碼,相關說明都在註釋裏
注意:代碼正常運行的條件有:MySQL中創建了名爲dmqdb的數據庫,該數據庫下創建好了student_list
、late_list
、early_list
、absence_list
、sick_list
五張表。
五張表的屬性都是一樣,給出Navicat截圖
--以Student表爲例
create table Student(
SNumber varchar(10) PRIMARY KEY not null,
SName varchar(20) not null
);
/*
其他的表就是列名換了一下,其他都一樣。
late_list是LNumber和LName,absence_list是ANumber和AName,
early_list是ENumber和EName,sick_list是SINumber和SIName
*/
截圖就放一個student_list表做示範,其他表就列名不同,其他都一樣。
# 點名器V3
import csv
import random
import pymysql
# 規定的一些常量
student_late = [] # 存儲遲到名單
students_late = [] # 遲到錄入名單 這種形式[[姓名, 學號], [], [], ....]
# student_absence = [] # 存儲曠課名單(不需要,因爲absence這個表是通過late和early交運算得到的)
students_absence = [] # 曠課錄入名單 這種形式[[姓名, 學號], [], [], ....]
student_sick = [] # 存儲請假名單
students_sick = [] # 請假錄入名單 這種形式[[姓名, 學號], [], [], ....]
student_early = [] # 存儲早退名單
students_early = [] # 早退錄入名單 這種形式[[姓名, 學號], [], [], ....]
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123', db='dmqdb') # 創建connect對象,連接數據庫
###
# 功能:csv文件寫入數據庫
# 輸入:csv文件路徑名(str)
# 返回:None
###
def data_in(file):
# 清空所有表(原因應該都懂,如果每次程序開始不清空,很容易積累錯誤信息)
cur = conn.cursor()
cur.execute("truncate table student_list")
conn.commit()
cur.execute("truncate table late_list")
conn.commit()
cur.execute("truncate table early_list")
conn.commit()
cur.execute("truncate table absence_list")
conn.commit()
cur.execute("truncate table sick_list")
conn.commit()
# 從csv中向student_list插入
with open(file, newline='') as info:
data = csv.reader(info)
for row in data:
cur = conn.cursor() # 創建遊標
cur.execute('INSERT INTO student_list values '
+ str((row[1], row[0]))) # 傳遞每一行的數據
conn.commit() # 確定執行語句
###
# 功能:讀入csv文件學生名單
# 輸入:文件名(string)
# 返回值:學生全部信息(dict),學生名單(list)
###
def file_in(file_name):
students_info = {}
students_name = []
# open()函數讀入文件
with open(file_name, newline='') as info:
reader = csv.reader(info)
for row in reader:
students_info[row[0]] = row[1]
students_name.append(row[0])
return students_info, students_name
###
# 功能:產生隨機學生名單
# 輸入:學生名單(list)
# 返回值:打亂的學生名單(list)
###
def new_list(students_name):
student_upset_name = random.sample(students_name, len(students_name))
return student_upset_name
###
# 功能:完成點名器的初始化,整合了new_list()、data_in()和file_in()三個函數
# 輸入:學生名單(list)
# 返回值:學生信息(dict)和打亂的學生名單(list)
###
def dmq_init(file_name):
data_in(file_name)
student_info = file_in(file_name)[0]
# print(students_wg_dict)
student_upset_name = new_list(file_in(file_name)[1])
# print(students_wg_list)
return student_info, student_upset_name
###
# 功能:第一次點名,更新請假名單和遲到名單
# 輸入:打亂的學生名單(list)
# 返回值:None
###
def dmq_dm(student_upset_name):
student_dm_wrong = []
print('課程即將開始!開始第一次點名!\n')
for name in student_upset_name:
temp = input(name + "到了嗎?(輸入到或沒到,請假輸入已請假)")
if temp == "到":
continue
elif temp == "沒到":
student_late.append(name)
elif temp == '已請假':
student_sick.append(name)
else:
student_dm_wrong.append(name)
print("請按要求輸入!該名字被放置最後點名。")
if student_dm_wrong:
for name in student_dm_wrong:
temp = input(name + "到了嗎?(輸入到或沒到,請假輸入已請假)")
if temp == "到":
continue
elif temp == "沒到":
student_late.append(name)
elif temp == '已請假':
student_sick.append(name)
else:
print("仍然未按照要求輸入!算入遲到名單!")
student_late.append(name)
###
# 功能:遲到名單的寫入和輸出
# 輸入:遲到學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_late(late_list, student_info, num):
# 向 遲到錄入名單 加入信息
for name in late_list:
students_late.append((name, student_info[name]))
# 輸出 遲到錄入名單
print_info('遲到', students_late, num)
# 寫入 遲到表
cur = conn.cursor()
for info in students_late:
cur.execute("INSERT INTO late_list VALUES " + str(info))
conn.commit()
print("\n已導出遲到學生名單!數據庫dmqDB下的late_list表中\n")
###
# 功能:請假名單的寫入和輸出
# 輸入:請假學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_sick(sick_list, student_info, num):
# dmq_file_in_sick()、dmq_file_in_early()和dmq_file_in_absence()都是一個原理,註釋參照dmq_file_in_late()
for name in sick_list:
students_sick.append((name, student_info[name]))
print_info('請假', students_sick, num)
# 寫入表
cur = conn.cursor()
for info in students_sick:
cur.execute("INSERT INTO sick_list VALUES " + str(info))
conn.commit()
print("\n已導出請假學生名單!數據庫dmqDB下的sick_list表中\n")
###
# 功能:早退名單的寫入和輸出
# 輸入:早退學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_early(early_list, student_info, num):
for name in early_list:
students_early.append((name, student_info[name]))
print_info('早退', students_early, num)
cur = conn.cursor()
for info in students_early:
cur.execute("INSERT INTO early_list VALUES " + str(info))
conn.commit()
print("\n已導出早退學生名單!數據庫dmqDB下的early_list表中\n")
###
# 功能:曠課名單的寫入和輸出
# 輸入:曠課學生名單(list)和學生全部信息(dict)以及一行的顯示數量
# 返回值:None
###
def dmq_file_in_absence(absence_list, student_info, num):
for name in absence_list:
students_absence.append((name, student_info[name]))
print_info('曠課', students_absence, num)
cur = conn.cursor()
for info in students_absence:
cur.execute("INSERT INTO absence_list VALUES " + str(info))
conn.commit()
print("\n已導出曠課學生名單!數據庫dmqDB下的absence_list表中\n")
###
# 功能:輸出 特定 列表數據
# 輸入:名單名稱、特定的list [[*, *], [*, *], [*, *], ...]和每行顯示數字
# 返回值:None
###
def print_info(string, special_list, num):
count = 0
print('--'*5 + '**' + string + '名單(' + str(num) + '個一行)' + '**' + '--'*5)
for i in special_list:
if (count % num == 0) & (count != 0):
print()
print(i[0]+","+i[1], end=' ')
count += 1
###
# 功能:第二次點名
# 輸入:打亂的學生名單(list)
# 返回值:早退的學生名單(list)
###
def dmq_dm_2(list_1):
name_list = list(set(list_1) - set(student_sick))
student_dm_wrong = []
print('\n下課時間到!開始第二次點名!\n')
for name in name_list:
temp = input(name + "在嗎?(輸入在或不在)")
if temp == "在":
continue
elif temp == "不在":
student_early.append(name)
else:
student_dm_wrong.append(name)
print("請按要求輸入!該名字被放置最後點名。")
if student_dm_wrong:
for name in student_dm_wrong:
temp = input(name + "在嗎?(輸入在或不在)")
if temp == "在":
continue
elif temp == "不在":
student_early.append(name)
else:
print("仍然未按照要求輸入!算入早退名單!")
student_early.append(name)
###
# 功能: 計算兩列表的交集
# 輸入: 兩個列表(不分先後)
# 返回: None
###
def list_mix(list_1, list_2):
mix = []
for i in list_1:
if i in list_2:
mix.append(i)
return mix
def main(file_name, num):
# 讀入csv文件
temp = dmq_init(file_name)
student_info = temp[0]
name_list = temp[1]
# 第一次點名
dmq_dm(name_list)
# 第二次點名
dmq_dm_2(name_list)
# 對運算結果做出調整
# 交集運算出曠課名單
student_absence = list_mix(student_late, student_early)
# 遲到名單裏不能有曠課和請假的人(確保一下)
student_late_new = list(set(student_late) - set(student_absence) - set(student_sick))
# 早退名單裏不能有曠課和請假的人(確保一下)
student_early_new = list(set(student_early) - set(student_absence) - set(student_sick))
# 輸出並導入請假名單
dmq_file_in_sick(student_sick, student_info, num)
# 輸出並導入遲到名單
dmq_file_in_late(student_late_new, student_info, num)
# 輸出並導入早退名單
dmq_file_in_early(student_early_new, student_info, num)
# 輸出並導入曠課名單
dmq_file_in_absence(student_absence, student_info, num)
# return '程序結束'
# 5代表5個名字一行輸出
main("test.csv", 5)
最後
這次增加功能非常簡單快速,V3到V4的過程就1個小時不到,可能是代碼的可擴展性好和耦合性低有關,自己前兩次整改代碼還是有用的。
自己最近都在嘗試用GUI界面來實現點名器V4,不過一直還在調試階段,事件觸發和處理回調仍然是自己沒有攻克的難題。
大家有興趣也可以自己試試GUI界面,這裏分享出自己找到的學習資料:
Python GUI(
tkinter
) :
https://blog.csdn.net/Ans_min/article/details/105111342
這位博主tkinter系列整理的很全,自己前期零零散散找了些tkinter組件學習,很多都連不起來,導致現在的GUI界面始終有錯誤,不協調,學習一個模塊還是要系統性的學習,這位博主的tkinter系列就很好。
文章就到這裏,看完有幫助記得點贊。