Python中使用类属性存储用户数据并保存至CSV的异常问题
问题解决:CSV写入对象地址的修复及代码优化
问题原因
你看到的<__main__.User object at 0x...>是Python对象的默认字符串表示,因为csv.writer不知道如何处理自定义的User对象,只能输出它的内存地址。self参数在这里没有问题,你的User类初始化逻辑是正确的。
修复方案及优化代码
关键修改点
- 给
User类添加方法,返回可写入CSV的属性序列 - 写入CSV时,遍历
user_list,将每个对象转换为属性列表 - 修复菜单递归调用的问题(原代码的
return(menu())会导致递归嵌套,易引发栈溢出) - 增加CSV表头,让输出文件更规范
修改后的代码:
import csv user_list = [] class User: def __init__(self, first, last): self.first = first self.last = last self.email = first + '.' + last + '@expressdelivery.com' # 新增方法:返回CSV行数据 def to_csv_row(self): return [self.first, self.last, self.email] def menu(): while True: print("[1]. Add/remove/update: user to the system.") try: option = int(input("Choose from the menu: ")) if option == 1: # 创建User对象并添加到列表 new_user = User(first=input("Name: "), last=input("Last: ")) user_list.append(new_user) # 写入CSV文件 with open('User.csv', 'w', newline='') as file: writer = csv.writer(file) # 写入表头 writer.writerow(["First Name", "Last Name", "Email"]) # 遍历用户列表,写入每个用户的属性 for user in user_list: writer.writerow(user.to_csv_row()) print("用户已添加并保存") # 继续循环显示菜单,不需要递归调用menu() continue else: print("Program quits") break except ValueError: # 捕获输入非数字的错误,比裸except更精准 print("请输入有效的数字选项") except Exception as e: print(f"发生错误: {str(e)}") menu()
额外说明
newline=''参数:在Windows系统下写入CSV时避免出现多余空行,保证跨平台兼容性。- 精准异常捕获:原代码的
except:会捕获所有异常,改为针对性捕获ValueError处理输入错误,其他异常单独处理更便于调试。 - 避免递归调用:原代码的
return(menu())会不断嵌套调用函数,多次操作后会触发栈溢出错误,直接用continue回到循环开头即可。
内容的提问来源于stack exchange,提问作者Gino Chen
相关产品推荐
相关产品推荐

