一、任務描述
- 以18級網工學生名單爲例,從外部文件導入學生信息,隨機對班級所有同學進行點名;
- 判斷未到學生是否有請假條,有則視爲請假,無則視爲曠課。
- 對點名結束後進入教室的學生將曠課改爲遲到。
- 對中途離開課堂學生計爲早退(需要考慮學生既是遲到又是早退的情況)。
- 按照請假、曠課、遲到、早退四類分別展示。
- 將未到學生按照請假、曠課、遲到、早退四類分別存儲在四個.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(‘早退同學名單已保存。’)
四、樣例測試
進行兩次點名:
最終打印名單(部分):
四個處理好的表格:
五、用到的知識點
- 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位置元素取出並刪除該元素 - 循環語句
- 參考資料:
存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
六、代碼原創性說明
代碼爲原創,可以被借鑑,請勿照搬。