用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

六、代码原创性说明

代码为原创,可以被借鉴,请勿照搬。

发布了6 篇原创文章 · 获赞 4 · 访问量 868

猜你喜欢

转载自blog.csdn.net/qq_43845426/article/details/105020902