注册功能和登录功能实现有问题
大佬们,可以帮我改一段代码吗?python课后作业是实现一个注册功能和登录功能。还有两点要求1.账号里面是否存在非法字符
2.有没有存在的用户名
具体问题我在代码注释中写了# coding:utf-8
# @Author:星空日记
# #注册功能
illegal_str=['`','`','!','@','#','$','%','^','&','*','(',')']
list_username = []
list_password = []
index_username = 0
print('开始注册账号'.center(20,'-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
#用户名是否已被注册
with open('data/user_data.txt',mode='rt',encoding='utf-8') as f :
#想在这里做两个账号和密码分开的列表,但是报错了,不知道怎么修改
for line in f:
data_username,data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
for line in f:
if username in list_username:
pass
else:
print('用户名已被注册')
break
# #判断账号是否有非法字符
else:
for line1 in username:
if line1 not in illegal_str:
pass
else:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}')
print(list_password)
print(list_username)
#登录功能
print('开始登录账号'.center(20,'-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
for line2 in list_username:
if line2 == input_username:
index_username = list_username.index(line2)
if input_password == list_password:
print('登陆成功')
break
else:
print('账号或密码错误')
break
else:
print('账号或密码错误')
user_data.txt
d13423523---123456
fly---111
li---666
jay---333fly---66 根据你提供的代码,我注意到其中存在一些问题。以下是对你的代码进行修改和优化的建议:
# coding:utf-8
# @Author:星空日记
illegal_str = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []
print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
# 判断用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
for line in f:
data_username, data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
if username in list_username:
print('用户名已被注册')
else:
# 判断账号是否有非法字符
for char in username:
if char in illegal_str:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}')
print(list_password)
print(list_username)
# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
for i, name in enumerate(list_username):
if name == input_username:
if input_password == list_password:
print('登录成功')
break
else:
print('账号或密码错误')
break
else:
print('账号或密码错误')
对于账号是否存在非法字符的判断,我修改了变量名,使用了更加直观的char表示每个字符,并对username中的每个字符进行检查。如果存在非法字符,会按要求输出提示信息。
在用户名是否已被注册的判断中,我修改了for循环的逻辑。首先遍历文件中的用户名和密码,将它们分别存储在list_username和list_password列表中。然后,如果输入的用户名存在于list_username中,即表示用户名已被注册。
在登录功能中,我使用enumerate()函数获取到索引i和对应的用户名name,然后逐一比较输入的用户名和密码与列表中的对应项。如果找到匹配的用户名和密码,即表示登录成功。
希望这些修改能够帮助你完成注册功能和登录功能的实现。如果有任何问题,请随时提问。 当涉及到问题解决时,这段代码有几个地方需要进行改进。以下是针对你提供的代码的修改建议:
# coding:utf-8
# @Author:星空日记
# 注册功能
illegal_str = [' ', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []
print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
# 用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
for line in f:
data_username, data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
if username in list_username:
print('用户名已被注册')
elif any(char in illegal_str for char in username):
print('用户名存在非法字符')
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
f1.write(f'{username}---{password}\n')
# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
if input_username in list_username:
index_username = list_username.index(input_username)
if input_password == list_password:
print('登陆成功')
else:
print('账号或密码错误')
else:
print('账号或密码错误')
上述修改主要包括以下几个方面:
1. 注册功能中,对非法字符的判断使用了any()函数来检查用户名是否包含非法字符。
2. 在读取文件时,将用户名和密码分别存储到list_username和list_password列表中,以便后续比较。
3. 登录功能中,直接使用input_username在list_username` 中查找,无需遍历整个列表。
4. 确保注册信息和登录信息在文件中都以换行符结尾,以便每个记录单独占据一行。
这些修改应该能够使你的代码更加稳定地实现注册和登录功能,同时考虑了用户名非法字符和用户名已注册的情况。 首先,根据你提供的代码和要求,我帮你进行了一些修改。请注意以下几点:
- 代码注释和字符串前面的"#"符号之间需要有一个空格。
- 建议将非法字符的列表从全局变量移动到循环内部。这样可以在每次循环时重新初始化,以避免问题。
- 注册功能的用户名是否已被注册的判断部分存在逻辑错误,请参考下方的修改示例。
- 登录功能需要在读取用户数据后关闭文件。
# coding:utf-8
# @Author: 星空日记
# 注册功能
illegal_str = ['', '', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []
print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
for line in f:
data_username, data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
# 判断账号是否已被注册
if username in list_username:
print('用户名已被注册')
else:
# 判断账号是否有非法字符
for char in username:
if char in illegal_str:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}')
print(list_password)
print(list_username)
# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
for line2 in list_username:
if line2 == input_username:
index_username = list_username.index(line2)
if input_password == list_password:
print('登陆成功')
break
else:
print('账号或密码错误')
break
else:
print('账号或密码错误')
此外,请确认user_data.txt文件中的内容是否按照以下格式进行存储:
d13423523---123456
fly---111
li---666
jay---333
fly---66
如果还有其他问题,请随时提问。
如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
给我最佳答案呗!求你了!!!{:10_254:}{:10_254:}{:10_254:} 我也来求求吧{:10_254:}{:10_254:}{:10_254:}{:10_254:} 本帖最后由 Mike_python小 于 2023-8-3 12:22 编辑
啊?(楼上和楼上上) Mike_python小 发表于 2023-8-3 15:20
啊?(楼上和楼上上)
我是被ben逼的,只能同流合污了{:5_97:} 有修改后的代码吗 追光THO 发表于 2023-8-3 13:16
有修改后的代码吗
# coding:utf-8
# @Author:星空日记
illegal_str = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []
print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
# 判断用户名是否已被注册
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
for line in f:
data_username, data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
if username in list_username:
print('用户名已被注册')
else:
# 判断账号是否有非法字符
for char in username:
if char in illegal_str:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}')
print(list_password)
print(list_username)
# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
for i, name in enumerate(list_username):
if name == input_username:
if input_password == list_password:
print('登录成功')
break
else:
print('账号或密码错误')
break
else:
print('账号或密码错误')
下面是修改后的代码,解决了你提出的问题:
illegal_str = ['`', '`', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')']
list_username = []
list_password = []
print('开始注册账号'.center(20, '-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
# 判断账号是否有非法字符
for char in username:
if char in illegal_str:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='rt', encoding='utf-8') as f:
for line in f:
data_username, data_password = line.strip().split('---')
list_username.append(data_username)
list_password.append(data_password)
if username in list_username:
print('用户名已被注册')
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}\n')
# 登录功能
print('开始登录账号'.center(20, '-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
if input_username in list_username:
index_username = list_username.index(input_username)
if input_password == list_password:
print('登陆成功')
else:
print('账号或密码错误')
else:
print('账号或密码错误')
主要的修改包括:
判断账号是否有非法字符时,使用新的循环变量 char,避免与之前的变量 line1 混淆。
在注册账号时,将新注册的用户名和密码写入文件时,添加换行符 \n。
在登录功能中,直接通过条件语句判断用户名和密码是否正确,避免使用循环和索引。
请注意将合适的路径替换 open() 函数中的 'data/user_data.txt'。另外,建议在注册成功后,更新 list_username 和 list_password 列表,以避免重新打开文件读取数据。 你好,我发现你的代码有几个问题:
- 你的非法字符列表中有重复的符号,比如两个反引号。
- 你的第一个for循环中,如果用户名在列表中,应该打印“用户名已被注册”,而不是反过来。
- 你的第二个for循环中,如果用户名不在列表中,应该打印“账号或密码错误”,而不是反过来。
- 你的user_data.txt文件中有一个重复的用户名fly,这可能会导致错误。
我尝试修改了一下你的代码,你可以参考一下:
# coding:utf-8
# @Author:星空日记
# #注册功能
illegal_str=['`','!','@','#','$','%','^','&','*','(',')']
list_username = []
list_password = []
print('开始注册账号'.center(20,'-'))
username = input('请输入账号>>>').strip()
password = input('请输入密码>>>').strip()
#用户名是否已被注册
with open('data/user_data.txt',mode='rt',encoding='utf-8') as f :
#用splitlines方法可以直接得到每一行的内容,不需要再用strip和split
for line in f.splitlines():
data_username,data_password = line.split('---')
list_username.append(data_username)
list_password.append(data_password)
#用in操作符可以直接判断一个元素是否在列表中,不需要再用for循环
if username in list_username:
print('用户名已被注册')
else:
#判断账号是否有非法字符
for char in username:
if char in illegal_str:
print('用户名存在非法字符')
break
else:
with open('data/user_data.txt', mode='at', encoding='utf-8') as f1:
res1 = f1.write(f'{username}---{password}\n')
print(list_password)
print(list_username)
#登录功能
print('开始登录账号'.center(20,'-'))
input_username = input('请输入账号>>>').strip()
input_password = input('请输入密码>>>').strip()
#用index方法可以直接得到一个元素在列表中的位置,不需要再用变量记录
if input_username in list_username:
index = list_username.index(input_username)
if input_password == list_password:
print('登陆成功')
else:
print('账号或密码错误')
else:
print('账号或密码错误')
页:
[1]