路飞学城-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() 

导师批注:python

一、写代码必定要多注意代码的书写规范,多参阅pep8规范文档;编程

二、对用户输入的数据,应对首尾空格进行处理;函数

三、文件操做时,应指定字符编码格式(不一样的操做系统,会出现字符编码错误);学习

  在作这份做业时,也是刚学的python编程,看老师提供的视频教程,python编程从入门到实践这本书,在遇到老师所讲的或者本身在书上看到的不太明白的知识点时,就本身到网上诸如博客园之类的去寻找帮助,看看别人对于一个方法是怎么去使用,或者为了实现一个功能是用哪一个方法比较好,诸如该如何去实现文件的读写操做,这是在视频教程里还没讲到的内容,但做业里须要用到,那这就要求我必须提早去学习文件的读写操做是如何实现的。编码

  在作这份做业时个人重点也全都是放在了该如何去作出做业所要求实现的功能,对于其它如导师所提到的pep8编码规范则是从未据说也从未看到过,在看到导师批注后去认真的把这个pep8编码规范看了一遍,原来并非说咱们写完代码后不报错、能正常运行、能够实现所须要的功能就OK了,原来代码编写的背后还有这么个规范去要求咱们,诸如:spa

  空格的使用
    整体原则,避免没必要要的空格。
    1 各类右括号前不要加空格。
    2 逗号、冒号、分号前不要加空格。
    3 函数的左括号前不要加空格。如Func(1)。
    4 序列的左括号前不要加空格。如list[2]。
    5 操做符左右各加一个空格,不要为了对齐增长空格。
    6 函数默认参数使用的赋值符左右省略空格。
    7 不要将多句语句写在同一行,尽管使用‘;’容许。
    8 if/for/while语句中,即便执行语句只有一句,也必须另起一行。操作系统

  注释
    整体原则,错误的注释不如没有注释。因此当一段代码发生变化时,第一件事就是要修改注释!
    注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。若是是短语,能够省略结束符。
    1 块注释,在一段代码前增长的注释。在‘#’后加一空格。code

关于文件的读写操做:视频

  使用python来读写文件是很是简单的操做,咱们使用open()函数来打开一个文件,获取到文件句柄,而后经过文件句柄就能够对文件进行各类各样的操做了,根据打开方式的不一样,可以执行的操做也会有相应的差别。blog

  打开文件的方式有:r , w , a , r+ , w+ , a+ , rb , wb , ab , r+b , w+b , a+b等,默认使用的是r(只读)模式。

一、只读操做(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更多的是使用在读取非文本文件的时候,诸如读取MP三、图像‘视频等信息的时候就须要用到rb,由于这种数据是没有办法直接显示出来的,在实现文件的上传下载时也会用到rb。

    f.readline() 是一行一行的读取数据,可是在读取出来的数据结尾处会有一个\n,这时就须要咱们调用strip()方法将其去掉。

  循环读取数据这种方式是很好的,每次只读取出一行内容,从而就避免了产生内存溢出的问题。

  注意:读取完的文件句柄必定要关掉,使用pd.close()。

 

二、写模式(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()
相关文章
相关标签/搜索