Python通讯录代码仅保存最后输入项的问题及全量保存需求
问题分析
原代码存在两个核心问题导致无法保存全部联系人:
- 更新操作(选项7)错误依赖局部变量:选项7中直接使用了选项1里的
name和phone变量,这两个变量仅存储了最后一次添加的联系人信息,而非整个通讯录列表,因此只能写入最后一条记录。 - 保存与更新使用不同文件:选项6写入
contact_list.txt,选项7写入Saved_Contact_List.txt,导致两个文件内容不一致,且均无法完整存储全量联系人。
解决方案
我们可以统一文件存储逻辑,无论是首次保存还是后续更新,都将整个通讯录列表完整写入同一个文件,确保文件始终同步最新的通讯录状态。同时优化存储格式,让文件内容更易读。
修改后的完整代码
import re contact = {} def display_contact(): for name, number in sorted(contact.items()): print(f'Name: {name}, Number: {number}') # 从文件加载通讯录,启动时恢复之前的记录 def load_contacts(): try: with open('contact_list.txt', 'r') as file: # 读取每行内容并解析为联系人 for line in file: line = line.strip() if not line: continue # 拆分姓名和号码 name_part, num_part = line.split(', Number: ') name = name_part.replace('Name: ', '') number = int(num_part) contact[name] = number print("已加载之前保存的通讯录") except FileNotFoundError: # 文件不存在时跳过,不影响运行 pass # 启动时先加载已保存的通讯录 load_contacts() while True: try: choice = int(input(" 1. Add new contact \n 2. Search contact \n 3. Display contact\n 4. Edit contact \n 5. Delete contact \n 6. Save your contact as a file \n 7. Update Saved List \n 8. Exit \n Your choice: ")) except ValueError: print("请输入有效的数字选项") continue if choice == 1: while True: name = input("Enter the contact name ") if re.fullmatch(r'[a-zA-Z]+', name): break print("姓名只能包含英文字母,请重新输入") while True: try: phone = int(input("Enter number ")) # 验证号码为10位数字,可根据需求调整 if len(str(phone)) != 10: print("请输入10位数字的电话号码") continue break except ValueError: print("Sorry you can only enter a phone number") continue contact[name] = phone print(f"联系人 {name} 已添加") elif choice == 2: search_name = input("Enter contact name ") if search_name in contact: print(f"{search_name}'s contact number is {contact[search_name]}") else: print("Name is not found in contact book") elif choice == 3: if not contact: print("Empty Phonebook") else: display_contact() elif choice == 4: edit_contact = input("Enter the contact to be edited ") if edit_contact in contact: while True: try: phone = int(input("Enter new number ")) if len(str(phone)) != 10: print("请输入10位数字的电话号码") continue break except ValueError: print("Sorry you can only enter a phone number") continue contact[edit_contact] = phone print("Contact Updated") display_contact() else: print("Name is not found in contact book") elif choice == 5: del_contact = input("Enter the contact to be deleted ") if del_contact in contact: confirm = input("Do you want to delete this contact Yes or No? ") if confirm.lower() == 'yes': contact.pop(del_contact) print(f"联系人 {del_contact} 已删除") display_contact() else: print("Name is not found in phone book") elif choice == 6 or choice == 7: confirm = input("Do you want to save/update your contact-book Yes or No? ") if confirm.lower() == 'yes': # 统一写入整个通讯录,每行一个联系人,格式清晰 with open('contact_list.txt', 'w') as file: for name, number in sorted(contact.items()): file.write(f'Name: {name}, Number: {number}\n') print("通讯录已成功保存/更新!") else: print("通讯录未保存/更新。") elif choice == 8: # 退出时自动提示保存 confirm = input("退出前是否保存通讯录?Yes or No? ") if confirm.lower() == 'yes': with open('contact_list.txt', 'w') as file: for name, number in sorted(contact.items()): file.write(f'Name: {name}, Number: {number}\n') print("通讯录已保存") print("退出程序") break else: print("无效选项,请重新输入")
关键修改点说明
- 统一文件存储逻辑:将选项6和选项7合并为同一逻辑,均向
contact_list.txt写入整个通讯录的所有联系人,确保文件始终是最新的全量数据,解决了原代码仅保存最后一条记录的问题。 - 优化存储格式:放弃直接写入字典字符串的方式,改为每行存储一个联系人的清晰格式,既方便人工查看,也便于后续读取解析。
- 新增加载功能:启动程序时自动从文件加载之前保存的通讯录,避免每次启动都丢失数据。
- 增强输入验证:添加电话号码长度验证,确保输入的号码符合常规格式;优化选项输入的异常处理,避免非数字输入导致程序崩溃。
- 简化确认逻辑:使用
lower()统一处理用户输入的大小写,避免因输入YES或yes导致的判断错误。
内容的提问来源于stack exchange,提问作者NASAAndr3w07
相关产品推荐
相关产品推荐

