知识点:
1、读写文件
(1)打开一个文件可以使用Python内置的open()函数,传入文件名和标示符
(2)读写一个文件可以使用调用write()来写入文件,但是务必要调用 .close()来关闭文件
(3)文件使用完毕后必须使用 .close()关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
(4)由于文件读写时都有可能产生IOError
,一旦出错,后面的 .close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用with open() as 来自动帮我们调用close()
2、python文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量
- read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。如果文件大于可用内存,为了保险起见,可以反复调用
read(size)
方法,每次最多读取size个字节的内容 - readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理
- readline() 每次只读取一行,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()
注意:这三种方法是把每行末尾的'\n'也读进来了,它并不会默认的把'\n'去掉,需要我们手动去掉
3、sys.exit()会引发一个异常:SystemExit
,如果这个异常没有被捕获,那么python解释器将会退出。如果有捕获此异常的代码,那么这些代码还是会执行。捕获这个异常可以做一些额外的清理工作。0为正常退出,其他数值(1-127)为不正常退出,可抛异常事件供捕获
需求:输入用户名、密码,认证成功显示欢迎信息,输入错误三次后锁定用户
Readme:
1、zh_file是存放用户id及密码的文件
2、sd_file是存放被锁定的用户id的文档,默认为空
3、程序会对zh_file里的合法用户id进行判断,若连续输入用户id错误达三次程序直接退出
4、程序会输入对正确用户名后的密码进行判断,输入密码有3次机会,连续三次错误则会锁定用户id并且退出
流程图:
代码实现如下:
1 # zhonglixiansheng
2 import sys #导入sys模块,让我们可以调用sys.exit()来退出程序
3 username = input("请输入用户名:") # 使用input 使用户输入并赋值给username变量
4 password = input("请输入密码:") # 使用input 使用户输入并赋值给password变量
5 count = 0 #用户循环次数,初始值定义为0
6 while count < 3: #用户登录异常不超过3次就不断循环
7 sd_file = open('H:\python_pycharm\sd.txt', 'r+') #打开 sd.txt 文件,权限是读写,读取并赋值给sd_file变量;注意:这里不使用with open() as 是因为后面3次密码错误后要写入数据,所以不能自动关闭
8 sd_list = sd_file.readlines() #使用.readlines()的方法逐行读取sd_file文件全部内容,并赋值给sd_list
9 for sd_line in sd_list: #使用for循环读取sd_file的内容
10 sd_line = sd_line.strip('\n') #使用.strio()去掉换行符
11 if username == sd_line: #判断用户输入的账号在sd_list文件中是否存在
12 print("用户%s已锁定!"%username) #如果存在打印‘用户已锁定’
13 sd_file.close() #使用close()关闭sd_file文件
14 sys.exit(1) #调用.exit()来退出程序
15 with open('H:\python_pycharm\zh.txt', 'r') as zh_file: #打开 zh.txt 文件,权限是可读,读取并赋值给sd_file变量,使用完毕后自动关闭文件
16 zh_lise = zh_file.readlines() #使用.readlines()的方法逐行读取zh_file文件全部内容,并赋值给zh_list
17 for zh_line in zh_lise: #使用for循环读取zh_file的内容
18 (user,passwd) = zh_line.strip('\n').split() #分别获取账号和密码信息
19 if username == user: #判断账户是否在zh_file文件中是否存在
20 p = 0 #输入密码的循环次数,初始值定义为0
21 while p < 3: #密码输入错误不超过3次就不断循环
22 if password == passwd: #判断密码是否一致
23 print("用户%s登录成功" % username) #密码一致打印用户登录成功
24 sys.exit(0) #调用.exit()来退出程序
25 else:
26 if p != 2: #p=2时,是最后一次机会,总共3次机会,分别是[0,1,2]
27 password = input("密码错误,请重新输入,你还有%s次机会:"%(2-p)) #打印提示并重新输入密码
28 p += 1 #密码输入错误后,循环加1
29 else:
30 sd_file.write('%s\n'%username) #密码3次输入错误后,将账号写进sd_file文件
31 print("用户%s已锁定!"%username) #打印用户已锁定
32 sd_file.close() #使用close()关闭sd_file文件
33 sys.exit(1) #调用.exit()来退出程序
34 else:
35 pass #当用户没匹配时,跳过并继续循环
36 else:
37 if count != 2: #count=2时,是最后一次机会,总共3次机会,分别是[0,1,2]
38 username = input("用户名输入错误,请重新输入,你还有%s次机会:"%(2-count)) ##打印提示并重新输入账号
39 count += 1 #账号输入错误后,循环加1
40 else:
41 print("用户名错误,已退出!") #账号3次输入错误后,打印用户名错误
42 sys.exit(0) #调用.exit()来退出程序
下面是zh.txt文件的内容:
zhongli 123
man 123
girl 123
下面是sd.txt文件的内容:
zhongli