路飞学城-python开发集训-第一章之用户登录作业
#coding = utf-8 import datetime today=datetime.date.today() #读取当前日期 password = {} #创建字典 passwd = open('user_file.txt','r') #以只读的模式打开,确保文件存在,否则报错 for f in passwd.readlines(): #读取文件的全部内容 u = f.split('\n')[0] #以回车为分割取出用户名 p = f.split('\n')[0] #以回车为分割取出密码 m = p.split('\n')[0] #以回车为分割符,取出密码的完整内容 password[p] = m #print (password) passwd.close() lock = {} user = {} lock_info = open('lock_file.txt','r') #以只读的模式打开 user_info = open('user_file.txt','r') #以只读的模式打开 for i in lock_info.readlines(): k1 = i.split('\n')[0] lock[k1]=k1 for u in user_info.readlines(): n=u.split('\n')[0] user[n]=n #print (lock) #print (user) count = 0 lock_info.close() user_info.close() username = input("请输入您的用户名:") if username in lock.keys(): print ("该用户已被锁定,无法正常登录!") elif username in user.keys(): pwd = input("请输入您的密码:") if pwd == password[username]: welcome=""" -----------Welcome info---------- 登录成功! 欢迎您:%s,今天是:%s. ---------------End-------------- """%(username,today) print(welcome) else: while count < 2: pwd = input("密码错误,请重新输入:") if pwd == password[username]: welcome=""" -----------Welcome info---------- 登录成功! 欢迎您:%s,今天是:%s. ---------------End-------------- """%(username,today) print(welcome) break count+=1 else: lock_user = open("lock_file.txt",'a') #将被锁定的用户名追加写入lock_file.txt文件中 lock_user.write(username+'\n') lock_user.close() print ("您的密码输入错误超过三次,用户被锁定!") else: print("无效的用户名,系统退出!") exit()
导师批注:
1、写代码一定要多注意代码的书写规范,多参阅pep8规范文档;
2、对用户输入的数据,应对首尾空格进行处理;
3、文件操作时,应指定字符编码格式(不同的操作系统,会出现字符编码错误);
在做这份作业时,也是刚学的python编程,看老师提供的视频教程,python编程从入门到实践这本书,在遇到老师所讲的或者自己在书上看到的不太明白的知识点时,就自己到网上诸如博客园之类的去寻找帮助,看看别人对于一个方法是怎么去使用,或者为了实现一个功能是用哪个方法比较好,诸如该如何去实现文件的读写操作,这是在视频教程里还没讲到的内容,但作业里需要用到,那这就要求我必须提前去学习文件的读写操作是如何实现的。
在做这份作业时我的重点也全都是放在了该如何去做出作业所要求实现的功能,对于其它如导师所提到的pep8编码规范则是从未听说也从未看到过,在看到导师批注后去认真的把这个pep8编码规范看了一遍,原来并不是说我们写完代码后不报错、能正常运行、可以实现所需要的功能就OK了,原来代码编写的背后还有这么个规范去要求我们,诸如:
空格的使用
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
注释
总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。如果是短语,可以省略结束符。
1 块注释,在一段代码前增加的注释。在‘#’后加一空格。
关于文件的读写操作:
使用python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以对文件进行各种各样的操作了,根据打开方式的不同,能够执行的操作也会有相应的差异。
打开文件的方式有:r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b等,默认使用的是r(只读)模式。
1、只读操作(r、rb)
pd = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开,确保文件存在,否则报错
for f in pd.readlines(): # 读取文件的全部内容
u = f.split('\n')[0] # 以回车为分割取出用户名
p = f.split('\n')[0] # 以回车为分割取出密码
m = p.split('\n')[0] # 以回车为分割符,取出密码的完整内容
password[p] = m
pd.close()
需要注意的是:文件操作时,应指定字符编码格式(不同的操作系统,会出现字符编码错误),encoding表示编码集,根据文件的实际保存编码进行获取数据,对于我们而言,更多的是utf-8。
rb读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集。rb更多的是使用在读取非文本文件的时候,诸如读取MP3、图像‘视频等信息的时候就需要用到rb,因为这种数据是没有办法直接显示出来的,在实现文件的上传下载时也会用到rb。
f.readline() 是一行一行的读取数据,但是在读取出来的数据结尾处会有一个\n,这时就需要我们调用strip()方法将其去掉。
循环读取数据这种方式是很好的,每次只读取出一行内容,从而就避免了产生内存溢出的问题。
注意:读取完的文件句柄一定要关掉,使用pd.close()。
2、写模式(w、wb、a)
写的时候要注意,如果没有文件,则会自动创建文件,如果文件已经存在,则会将原文件中的内容全部删除后再将新内容写入到文件中:
lock_user = open("lock_file.txt", mode='a', encoding='utf-8') # 将被锁定的用户名追加写入lock_file.txt文件中
lock_user.write(username+'\n')
lock_user.close()
print("您的密码输入错误超过三次,用户被锁定!")
wb模式下,可以不指定打开文件的编码集,但是在写文件的时候必须将字符串转化成utf-8的bytes数据。
a 追加模式下, 写入的内容会加在结尾。
修改完后代码如下:
1 #coding = utf-8 2 import datetime 3 import os 4 today = datetime.date.today() # 读取当前日期 5 password = {} # 创建字典 6 pd = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开,确保文件存在,否则报错 7 for f in pd.readlines(): # 读取文件的全部内容 8 u = f.split('\n')[0] # 以回车为分割取出用户名 9 p = f.split('\n')[0] # 以回车为分割取出密码 10 m = p.split('\n')[0] # 以回车为分割符,取出密码的完整内容 11 password[p] = m 12 pd.close() 13 lock = {} 14 user = {} 15 lock_info = open('lock_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开 16 user_info = open('user_file.txt', mode='r', encoding='utf-8') # 以只读的模式打开 17 for i in lock_info.readlines(): 18 k1 = i.split('\n')[0] 19 lock[k1] = k1 20 for u in user_info.readlines(): 21 n = u.split('\n')[0] 22 user[n] = n 23 count = 0 24 lock_info.close() 25 user_info.close() 26 username = input("请输入您的用户名:").strip() 27 if username in lock.keys(): 28 print("该用户已被锁定,无法正常登录!") 29 elif username in user.keys(): 30 pwd = input("请输入您的密码:").strip() 31 if pwd == password[username]: 32 welcome = """ 33 -----------Welcome info---------- 34 登录成功! 35 欢迎您:%s,今天是:%s. 36 ---------------End-------------- 37 """ % (username, today) 38 print(welcome) 39 else: 40 while count < 2: 41 pwd = input("密码错误,请重新输入:").strip() 42 if pwd == password[username]: 43 welcome = """ 44 -----------Welcome info---------- 45 登录成功! 46 欢迎您:%s,今天是:%s. 47 ---------------End-------------- 48 """ % (username, today) 49 print(welcome) 50 break 51 count += 1 52 else: 53 lock_user = open("lock_file.txt", mode='a', encoding='utf-8') # 将被锁定的用户名追加写入lock_file.txt文件中 54 lock_user.write(username+'\n') 55 lock_user.close() 56 print("您的密码输入错误超过三次,用户被锁定!") 57 else: 58 print("无效的用户名,系统退出!") 59 exit()