Python写入用户注册CSV文件时原有数据被覆盖问题求助
问题原因&修复方案
核心问题:程序启动强制清空CSV覆写表头
你每次运行程序时,开头的这段代码会直接清空原有文件内容:
with open('users.csv', 'w') as f: writer = csv.writer(f) writer.writerow(header)
open()的w模式是「覆盖写入模式」,只要调用就会先清空文件全部内容再写入新数据,所以每次重启程序后原有用户数据都会被删掉重写表头,这就是数据被覆盖的根本原因。
其他需要修复的隐藏bug
- 注册完成后未清空
new_user列表:如果在一次程序运行中多次注册用户,列表会不断累加之前的所有用户数据,导致一行写入多个人的信息,格式完全错乱。 user_id不会自增:当前写死user_id = 0,所有新用户的ID都会是1,无法实现ID自增的需求。- 多余的文件关闭操作:
with上下文管理器会自动管理文件生命周期,退出代码块时会自动关闭文件,不需要额外写f.close()、e.close()。 - 密码明文存储:生产环境绝对不能明文存储用户密码,后续建议加入哈希加密逻辑。
修正后的参考代码
首先导入缺失的依赖:
import csv from datetime import datetime import os
修改表头写入逻辑、注册逻辑:
header = ['ID', 'First Name', 'Last Name', 'Email', 'Phone', 'Date Registered', 'Password'] csv_path = 'users.csv' # 仅当CSV文件不存在/文件为空时才写入表头 if not os.path.exists(csv_path) or os.path.getsize(csv_path) == 0: with open(csv_path, 'w', newline='') as f: writer = csv.writer(f) writer.writerow(header) # 初始化用户ID:读取现有CSV最后一行的ID值,没有数据则默认从0开始 user_id = 0 if os.path.exists(csv_path) and os.path.getsize(csv_path) > 0: with open(csv_path, 'r') as f: lines = f.readlines() if len(lines) > 1: # 有表头+至少一行用户数据 last_line = lines[-1].strip().split(',') user_id = int(last_line[0]) print(f" Welcome to the new online shop! \n") print(f" You will need registration to enter.\n If you don't have please enter 0. \n " f"If you already have - please enter 1.\n For ADMIN menu - please enter 9") class UserId: def __init__(self, id_user, new_user_fn, new_user_ln, new_user_em, new_user_phone, _new_user_pas, new_user_date_reg): self.id_user = id_user self.new_user_fn = new_user_fn self.new_user_ln = new_user_ln self.new_user_em = new_user_em self.new_user_phone = new_user_phone self.new_user_date_reg = new_user_date_reg self._new_user_pas = _new_user_pas def user_registration(): global user_id now = datetime.now() dt = now.strftime("%d/%m/%Y %H:%M:%S") print(f" Enter your First name: ") new_user_fn = str(input()).upper() print(f" Enter your Last name: ") new_user_ln = str(input()).upper() print(f" Enter your email: ") new_user_em = input().upper() print(f" Enter your phone number: ") new_user_phone = str(input()) new_user_date_reg = dt print(f" Enter your password: ") new_user_pas = str(input()) # 每次注册新建列表,避免数据累加 new_user = [] user_id += 1 new_user.append(user_id) new_user.append(new_user_fn) new_user.append(new_user_ln) new_user.append(new_user_em) new_user.append(new_user_phone) new_user.append(new_user_date_reg) new_user.append(new_user_pas) with open(csv_path, 'a+', newline="") as e: writer1 = csv.writer(e) writer1.writerow(new_user)
内容的提问来源于stack exchange,提问作者Tanichka
相关产品推荐
相关产品推荐

