题目
用python的文件操作方法写一个用户登录管理程序:
- 有用户和管理员两个登录接口
- 用户登录验证用户名和密码,密码错误三次锁定;用户可以注册
- 管理员可添加、删除、解锁、锁定、查询用户
流程图

主要功能
用户登录信息存储在id_data文件中,读取和追加写入文件分别用’r’和’a’打开文件,修改文件的方法则是新建文件,修改后的内容写入新文件,再使用os模块的remove()和rename()函数删除原文件和重命名新文件。
菜单
输入序号即可执行,注意input()默认为字符串类型,需要判断和转换为整型;以下展示主菜单,其他菜单同下。
def main_menu():
"""主菜单,返回值'1. 登录', '2. 注册', '0. 退出'"""
menu = ('1. 登录', '2. 注册', '0. 退出')
print('\n\n', '主界面'.center(20, '-'))
for i in menu:
print(i)
while True:
choice = input('\n请输入你的选择:')
if choice.isdigit() and int(choice) in range(3):
return int(choice)
else:
print('输入不正确,请重新输入!\n')
显示效果:

登录
用户或管理员登录,主要判断用户名的状态以及密码,密码错误三次将被锁定。
def login():
'''登录过程,用户和管理员登录'''
while True:
print('\n\n', '登录界面/按b返回'.center(20, '-'))
usrname = input('请输入用户名:')
if usrname == 'b':
break
elif usrname == 'admin':
for cnt in range(3):
passwd = input('请输入管理员密码:')
if passwd == 'admin':
administrator()
else:
print('密码错误 %d 次,错误三次返回主菜单!\n' % (cnt+1))
else:
break
elif isstatus(usrname) == 1:
for cnt in range(3):
passwd = input('请输入密码/按b返回:')
if passwd == 'b':
break
elif iscorrect(usrname, passwd):
exit('登录成功!正在退出……')
else:
print('密码错误 %d 次,错误三次锁定用户!\n' % (cnt+1))
else:
lock(usrname)
elif isstatus(usrname) == 2:
print('用户已被锁定,请联系管理员解锁!\n')
else:
print('用户名不存在,请先注册!\n')
其中部分调用函数解释如下:
- isstatus()
def isstatus(usrname):
'''判断用户状态,若已注册且状态正常则返回1,\
已注册并且被锁定返回2,未被注册返回0'''
with open('id_data', 'r', encoding='utf-8') as f:
for line in f:
if usrname.join(['#', '#']) in line:
return 1
elif usrname.join(['$', '$']) in line:
return 2
else:
return 0
- iscorrect()
def iscorrect(usrname, passwd):
'''判断用户名和密码是否正确,正确就返回1,否则返回0'''
id_normal = '#'.join(['', usrname, passwd, ''])
with open('id_data', 'r', encoding='utf-8') as f:
for line in f:
if id_normal in line:
return 1
else:
return 0
- lock()和unlock()
def lock(usrname, tag_old='#', tag_new='$'):
'''锁定用户,即把标识#换成$'''
id_normal = tag_old.join(['', usrname, ''])
id_locked = tag_new.join(['', usrname, ''])
with open('id_data', 'r', encoding='utf-8') as f,\
open('id_data.bak', 'w', encoding='utf-8') as f_new:
for line in f:
if id_normal in line:
line = line.replace(id_normal, id_locked)
f_new.write(line)
os.remove('id_data')
os.rename('id_data.bak', 'id_data')
if tag_old == '#':
print('用户已被锁定,请联系管理员解锁!\n')
else:
print('用户已解锁,可以正常登录!\n')
def unlock(usrname):
'''解锁用户'''
lock(usrname, tag_old='$', tag_new='#')
管理
管理员操作界面,有添加、删除、解锁、锁定、查询用户等功能,其中调用的函数将不作赘述。
def administrator():
'''管理员操作过程,包括添加,删除,解锁,上锁,查询,退出'''
while True:
choice = admin_menu()
if choice == 1:
register()
elif choice == 2:
delete()
elif choice == 3:
while True:
print('\n\n', '解锁/按b返回'.center(20, '-'))
usrname = input('请输入用户名')
if usrname == 'b':
break
elif isstatus(usrname) == 2:
unlock(usrname)
else:
print('该用户无需解锁!\n')
break
elif choice == 4:
while True:
print('\n\n', '上锁/按b返回'.center(20, '-'))
usrname = input('请输入用户名')
if usrname == 'b':
break
elif isstatus(usrname) == 1:
lock(usrname)
else:
print('该用户无需上锁!\n')
break
elif choice == 5:
while True:
print('\n\n', '查询/按b返回'.center(20, '-'))
usrname = input('请输入用户名:')
if usrname == 'b':
break
elif isstatus(usrname) == 1:
print('该用户状态正常。\n')
elif isstatus(usrname) == 2:
print('该用户已被锁定。\n')
else:
print('没有找到该用户!\n')
else:
exit()
知识丶总结
- 文件修改方法:新建文件存储修改后的内容,再使用
os模块的remove()和rename()函数删除原文件和重命名新文件。 input()默认字符串类型,注意转换str.center()规定宽度把字符串放中间,不够的用字符填充and和or判断的时候,优先级小于in,并且a in c and/or b in c不可写作a and/or in c- python中的条件语句可以用
if-elif-...-else实现 - 利用函数(过程)让代码结构更清楚
这个小程序我花了三天才完成。虽然我首先画完了流程图整理了思路,但是在实际写代码的时候发现有好多重复代码,因此决定推翻之前的思路重新构写,其实大多数时间都是在优化函数结构,让代码条理更加清晰。虽然现在写完感觉还是有很多可优化的部分。
源代码
https://github.com/artintZ/python/blob/master/day3/user_login.py