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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:10