zoukankan      html  css  js  c++  java
  • 3.13-文件处理练习

    #一:今日作业:
    #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分支的功能否使用其他更为优美地方式实现
  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/12486925.html
Copyright © 2011-2022 走看看