前言
继续之前的简单课堂点名器V1,我们现在有了新的需求。
需求分析
我们的需求是:
然后我们想想大概的思路。
在项目源文件目录下创建csv格式文件students_list并录入所有学生信息(创建excel文件,然后另存为csv格式)
在python中导入csv模块(若没有就打开cmd,使用pip命令下载csv),利用open()、csv中的reader()等函数搭配,得到数据,然后通过项目1的思路(这里不再赘述),达到项目2的目的。
随机点名可以先得出一个含所有学生姓名的list,然后使用random模块中的sample()函数,得到含打乱的学生姓名的list,利用for循环实现随机点名;
将未到同学的信息输出且导入新的csv文件可以使用csv的writer()函数和open()等函数搭配,将未到的同学写入csv文件中;
点名环节需要处理不按要求输入的用户,可以单独定义一个list,然后最后再进行点名;若同一个学生答道再次输入错误,该同学将会被导入未到学生名单。
代码实现
然后我们可以开始写代码来实现V2了。
# 点名器V2
import csv
import random
'''
功能:读入csv文件学生名单
输入:文件名
返回值:学生名单(list),学生全部信息(dict)
'''
def file_in(file_name):
students_info = {}
students_name = []
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
'''
功能:完成点名器的初始化
输入:学生名单(list)
返回值:学生信息(dict)和打乱的学生名单(list)
'''
def dmq_init(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)
返回值:未到学生名单(list)
'''
def dmq_dm(student_upset_name):
student_late = []
student_dm_wrong = []
for name in student_upset_name:
temp = input(name + "到了吗?(输入到或没到)")
if temp == "到":
continue
elif temp == "没到":
student_late.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)
else:
print("仍然未按照要求输入!算入未到名单!")
student_late.append(name)
return student_late
'''
功能:写入csv文件,输出未到名单
输入:未到学生名单(list)和学生全部信息(dict)
返回值:无
'''
def dmq_file_in(students_late, student_info, num):
students_late_info = []
for name in students_late:
students_late_info.append([name, student_info[name]])
print_info(students_late_info, num)
with open("late_students_info.csv", "w", newline="") as file_in:
file_writer = csv.writer(file_in, quotechar='|', quoting=csv.QUOTE_MINIMAL)
for info in students_late_info:
file_writer.writerow(info)
print("\n已导出未到学生名单!文件位置位于当前目录下late_students_info.csv")
'''
功能:输出传入的 特定 列表数据
输入:特定的list [[*, *], [*, *], [*, *], ...]
返回值:无
'''
def print_info(special_list, num):
count = 0
print("未到名单如下("+str(num)+"个一行):")
for i in special_list:
if (count % num == 0) & (count != 0):
print()
print(i[0]+","+i[1], end=' ')
count += 1
# 主函数
def main(file_name):
# 5代表5个名字一行输出
dmq_file_in(dmq_dm(dmq_init(file_name)[1]), dmq_init(file_name)[0], 5)
main("students_list.csv")
在这里的csv文件都是放在与py文件同一路径下的。
csv模块以及random模块的使用参考官方Python API:
https://docs.python.org/zh-cn/3.8/library/csv.html
https://docs.python.org/zh-cn/3.8/library/random.html
运行截图
因为目标csv文件里面有80个学生信息,测试的时候要输入80次。。。。太麻烦了,所以我创了一个10个学生信息的csv表,命名为test.csv,前两张测试图就是测试test.csv文件得出的;
第二张测试了输入格式错误时,程序的输出;
第三张我们测试全部的80个学生的csv表;
总结
相对于V1,V2的功能有很多的提升,我们还用到了random和csv两个模块,random模块是为了实现随机点名,只用到了sample();csv模块用到了reader()和writer(),搭配open()函数完成文件读入写出。另外,相对V1,V2最大的不同就是使用了函数,把程序分成了很多函数,这样也提高了程序的可扩展性。
标签:info,点名,name,Python,list,students,V2,student,csv
来源: https://blog.csdn.net/Ans_min/article/details/104778524