#一:今日作业:
#1、编写文件copy工具
copy_file = input("请输入您需要复制的文件:").strip()
new_file = input("请输入您需要创建的副本:").strip()
# 此处路径若直接用 copy_file,不进行处理,则Windows默认的路径分隔符""
# 在python语法中将会被认作转义符,无法正常对文件进行读取
with open(rf"{copy_file}",mode="rt",encoding="utf-8") as f1,
open(rf"{new_file}",mode="wt",encoding="utf-8") as f2: # 在字符串前加r。即非转义的原始字符串
res = f1.read() # read功能,从指针当前位置至末尾数据读入内存。将其返回值赋值给res
# 当使用mode="rt" rt模式打开时,指针一开始在文件开始位置,所以可将文件整段代码读入内存并赋值给res
f2.write(res) # 将res中的数据,写入new_file。
#2、编写登录程序,账号密码来自于文件
inp_name = input("请输入账号:")
inp_password = input("请输入密码:")
with open("userdata.txt",mode="rt",encoding="utf-8") as f:
for line in f:
username,password = line.strip().split(":")
if username == inp_name and password == inp_password:
print("登陆成功!")
break
else:
print("登陆失败!")
#3、编写注册程序,账号密码来存入文件
def register():
inp_name = input("请输入注册账号:")
with open("userdata.txt",mode="r+t",encoding="utf-8") as f: # 此处必须用r+模式打开,不然指针在末尾,无法遍历
for line in f: # a模式打开 指针在末尾,无法判断。
# 这个line应该就是从当前指针位置开始向下迭代
username,password = line.strip().split(":")
if username == inp_name:
print("账号已存在,请重新尝试其他用户名!")
break
else:
inp_password = input("请设定密码:")
f.write(f"{inp_name}:{inp_password}
")
#二:周末综合作业:
# 2.1:编写用户登录接口
#1、输入账号密码完成验证,验证通过后输出"登录成功"
#2、可以登录不同的用户
#3、同一账号输错三次锁定,(提示:锁定的用户存入文件中,这样才能保证程序关闭后,该用户仍然被锁定)
def login():
import os
import time
count = {}
exist = []
tag = True
def unlocked(): # 用于解锁
print("您被锁定,请等待5秒后重试!")
time.sleep(5)
os.remove("locked.txt")
count[inp_name] = 0
while tag:
inp_name = input("请输入账号(退出输入Q):")
if inp_name == "q" or inp_name == "Q":
print("程序已退出。")
break
inp_password = input("请输入密码:")
with open("userdata.txt",mode="rt",encoding="utf-8") as f:
if os.path.exists('locked.txt'): # 查看是否有被锁定账号。
with open("locked.txt",mode="rt",encoding="utf-8") as f1: # 对locked.txt中账号进行判断,若是输入的账号,则锁定五秒再解锁。
res = f1.read().strip()
if res == inp_name:
unlocked()
else:
for line in f: # 取出userdata中数据逐行判断
username,password = line.strip().split(":")
if username == inp_name and password == inp_password:
print("登陆成功!")
tag = False
break
elif username == inp_name: # 不能单纯判断密码与账号是否一致,还要保存账号用于判断是否存在
exist.append(inp_name)
else:
if inp_name in count and inp_name in exist: # 必须进行存在性判断,不然会出现对不存在的账号锁定的情况
count[inp_name] += 1
print(f"登陆失败!尊敬的用户{inp_name},您已输错{count[inp_name]}次,错误3次将被锁定!")
elif inp_name in exist:
count[inp_name] = 1
print(f"登陆失败!尊敬的用户{inp_name},您已输错{count[inp_name]}次,错误3次将被锁定!")
else:
print("该账号不存在!")
for i in count: # 对每个输错的账号都进行计数,当有账号错误计数到3时,创建locked。
if count[i] == 3:
with open("locked.txt",mode="wt",encoding="utf-8") as f:
f.write(i)
unlocked()
# 2.2:编写程序实现用户注册后,可以登录,
#提示:
while True:
msg = """
0 退出
1 登录
2 注册
"""
print(msg)
cmd = input('请输入命令编号>>: ').strip()
if not cmd.isdigit():
print('必须输入命令编号的数字,傻叉')
continue
if cmd == '0':
break
elif cmd == '1':
login()
pass
elif cmd == '2':
register()
pass
else:
print('输入的命令不存在')
# 思考:上述这个if分支的功能否使用其他更为优美地方式实现