用Python實現一個簡單課堂點名器V3

一、任務描述
  1. 以18級網工學生名單爲例,從外部文件導入學生信息,隨機對班級所有同學進行點名;
  2. 判斷未到學生是否有請假條,有則視爲請假,無則視爲曠課。
  3. 對點名結束後進入教室的學生將曠課改爲遲到。
  4. 對中途離開課堂學生計爲早退(需要考慮學生既是遲到又是早退的情況)。
  5. 按照請假、曠課、遲到、早退四類分別展示。
  6. 將未到學生按照請假、曠課、遲到、早退四類分別存儲在四個.csv格式的文件中。

二、方案

1.思路:上課前點名下課後點名,總共進行兩次點名。第一次點名判斷學生是否請假,第一次點名未到,第二次點名到:遲到,第一次點名到,第二次點名未到:早退,第一次點名第二次點名都未到:曠課。
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.輸出:第二次點名結束後,將qjlb、cdlb、ztlb、kklb打印在屏幕上。再講qjlb、cdlb、ztlb、kklb依次寫入“請假同學名單.csv”……文件。

三、代碼

from openpyxl import load_workbook
import random
import csv

workbook = load_workbook(‘D:\2238029330\FileRecv\網工18.xlsx’) #名單從指定路徑讀入
booksheet = workbook.active
xhlb = []
xmlb = []
qjlb = []
kklb1,kklb2 = [],[]
cdlb1,cdlb2 = [],[]
ztlb1,ztlb2 = [],[]
shuzi = []

def save_as_file(filename,listname):
test = [‘id’, ‘name’]
load = ‘D:\2238029330\FileRecv\’+filename+‘同學名單.csv’
with open(load, ‘a’, newline=’’) as f:
write = csv.writer(f)
write.writerow(test)
write.writerows(listname)
f.close()

for num in range(0,80): #在shuzi中存入80個隨機數
shuzi.append(num)
shuzi = random.sample(shuzi,80)

for i in range(1,81): #依次將booksheet中的各列讀入變量和列表
xh = booksheet.cell(row=i, column=1).value
xhlb.append(xh)
xm = booksheet.cell(row=i, column=2).value
xmlb.append(xm)

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]

print(‘請假同學名單如下:’)
print(qjlb)
save_as_file(‘請假’,qjlb)
print(‘請假同學名單已保存。\n曠課同學名單如下:’)
print(kklb)
save_as_file(‘曠課’,kklb)
print(‘曠課同學名單已保存。\n遲到同學名單如下:’)
print(cdlb)
save_as_file(‘遲到’,cdlb)
print(‘遲到同學名單已保存。\n早退同學名單如下:’)
print(ztlb)
save_as_file(‘早退’,ztlb)
print(‘早退同學名單已保存。’)

四、樣例測試

進行兩次點名:
進行
最終打印名單(部分):在這裏插入圖片描述
四個處理好的表格:
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

五、用到的知識點

  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. 循環語句
    在這裏插入圖片描述
  5. 參考資料:
    存csv文件:
    https://www.cnblogs.com/liangxiyang/p/11272155.html
    https://www.cnblogs.com/tsruixi/p/11395160.html
    https://blog.csdn.net/bq_cui/article/details/81273659?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    兩個一維列表轉二維列表:
    https://blog.csdn.net/wangxingfan316/article/details/81387652
    導入xlsx:
    https://blog.csdn.net/index20001/article/details/73844576/
    python兩個列表取交集
    https://www.cnblogs.com/wr13640959765/p/9416184.html

六、代碼原創性說明

代碼爲原創,可以被借鑑,請勿照搬。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章