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()
关键修改说明
校验函数重构:
- 用
while True循环持续接收输入,直到获取可用用户名 - 将
next(fileobj2)移到循环外,仅跳过一次表头 - 遍历所有数据行检查用户名,避免漏检
- 移除错误递归,改用循环逻辑更清晰可靠
- 用
新用户函数优化:
- 移除多余的
while(True)循环(仅执行一次添加逻辑) - 去掉手动关闭文件的代码,由
with上下文管理器自动处理 - 用f-string替代
format,代码更简洁易读
- 移除多余的
内容的提问来源于stack exchange,提问作者sujalarora03
相关产品推荐
相关产品推荐

