You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python CSV用户系统:如何实现用户名重复校验的循环验证

问题分析与修复方案

原校验函数的核心问题

  • 遍历CSV时,next(fileobj2)放在循环内部,会跳过大量数据行,导致校验不完整
  • 仅检查一行就执行break,无法覆盖所有已存在的用户名
  • 递归调用时函数名错误(checkusername应为check),且递归逻辑无法实现持续校验
  • 没有循环机制强制用户输入未被占用的用户名

修复后的完整代码

1. 表头初始化函数(补充依赖导入,调整调用提示)

import csv
import hashlib

def datafirstrow():
    with open("data.csv", "w") as obj:
        fileobj = csv.writer(obj)
        fileobj.writerow(["Username", "Password", "First Name","Last Name","UserID","UPI ID","Bank Details","Mobile Info"])

# 仅首次运行时调用,避免覆盖已有数据
# datafirstrow()

2. 修复后的用户名校验函数

def check_username():
    while True:
        username = input("Enter username: ")
        exists = False
        with open("data.csv", "r") as obj:
            fileobj2 = csv.reader(obj)
            # 仅跳过一次表头
            next(fileobj2)
            for row in fileobj2:
                # 空行跳过,避免索引错误
                if row and row[0] == username:
                    exists = True
                    break
        if exists:
            print("Username is taken. Please input a unique username.\n")
        else:
            return username

3. 优化后的新用户添加函数

def newUser(userid):
    with open("data.csv", "a") as obj:
        fileobj = csv.writer(obj)
        # 调用修复后的校验函数获取可用用户名
        username = check_username()
        password = input("Enter password: ")
        pwd = hashlib.sha256(password.encode('utf-8')).hexdigest()
        First = input("Enter First Name: ")
        Last = input("Enter Last Name: ")
        Upi = input("Enter UPI ID: ")
        print("Enter Bank Details:\n")
        bankDetails = ""
        BankNumber = input("Please enter Account Number\n")
        bankDetails += f'Bank Account Number: {BankNumber}\n'
        BankName = input("Enter the Bank Name:\n")
        bankDetails += f'Bank Name: {BankName}\n'
        BankHolderName = input("Enter Account Holder Name\n")
        bankDetails += f'Account Holder Name: {BankHolderName}\n'
        IFSC = input("Enter IFSC Code: ")
        bankDetails += f'Branch IFSC Code: {IFSC}\n'
        mobile = input("Enter your Contact Number: ")
        record = [username, pwd, First, Last, userid, Upi, bankDetails, mobile]
        fileobj.writerow(record)
    # with语句自动关闭文件,无需手动调用obj.close()

关键修改说明

  1. 校验函数重构:

    • 用while True循环持续接收输入,直到获取可用用户名
    • 将next(fileobj2)移到循环外,仅跳过一次表头
    • 遍历所有数据行检查用户名,避免漏检
    • 移除错误递归,改用循环逻辑更清晰可靠
  2. 新用户函数优化:

    • 移除多余的while(True)循环(仅执行一次添加逻辑)
    • 去掉手动关闭文件的代码,由with上下文管理器自动处理
    • 用f-string替代format,代码更简洁易读

内容的提问来源于stack exchange,提问作者sujalarora03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 02:45:31