理清一个随机点名程序的逻辑
项目需求介绍
现在需要用python写一个随机点名的程序,满足老师上课点名抽取学生回答问题的需要。老师会提供:含有学生学号和姓名的文本文件
文件的格式是:
123456(学号) zzz(姓名)
…
涉及函数以及方法
- random类
- randint(a,b) #生成[a,b)范围之间的随机数
- 文件类
- open(filename,mode)、close()
- linecache类
- linecache.updatecache(fliename) #初始化
- linecache.clearcache #清理内存
- linecache.getline(filename,line) #获取某一行
选择理由
学生人数一定为整数,所以选择randint;由于老师提供我们是含有学生学号和姓名的文件所以需要进行一些文件操作,因此涉及到open和close且文件的访问方式应该是只读;我们需要获取文件中某一行的内容并且输出,所以选择getline
实现同种行为不同函数的比较
众所周知,在文件中读取某一行并输出有很多种实现的方法,为什么我会选择linecacahe类呢?
方法 | 特点 |
---|---|
readline | 读取一行(不可行,因为我们不知道有几行) |
readlines | 读取所有行存为列表,返回行数,顺序查找 |
linecache.getline | 按二分查找法寻找指定行数 |
不难发现readlines不太适合读取大文件,但是对于学生花名册还是绰绰有余的。而getline采用了二分查找法速度会稍快,并且对于大文件也和readlines有一些优势。如果一定要读取大文件,或许可以将一个大文件分成几个部分进行分步读取,可以减少内存的消耗。
代码展示
from random import*
import linecache
print("开始点名")
f1 = open("nname.txt","r",encoding='UTF-8')
linecache.updatecache("nname.txt")#及时更新文件内容
count = 0
for line in f1:#获取名单的行数,以每一行的序号作为随机的条件
count+=1
print("班级总人数为",count)
call = randint(1,count+1)#随机点名
print("点到名字的人在名单中的序号为",call)
#for i in range(1,count+1):
print("被点名的同学的学号和姓名是",linecache.getline("nname.txt",call))
print("点名结束")
linecache.clearcache#及时清除内存
f1.close
遇到的问题和解决办法
1.读取中文字的时候总是出错。在我打开文件没有特别指定编码格式的时候我总是无法读取文件里的中文字。因此我去查询了open函数的各种用法和参数列表,发现只要你确定了编码格式还是可以读取中文的
2.迭代器的原理刚开始不明白它的含义