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

Python通讯录代码仅保存最后输入项的问题及全量保存需求

问题分析

原代码存在两个核心问题导致无法保存全部联系人:

  1. 更新操作(选项7)错误依赖局部变量:选项7中直接使用了选项1里的name和phone变量,这两个变量仅存储了最后一次添加的联系人信息,而非整个通讯录列表,因此只能写入最后一条记录。
  2. 保存与更新使用不同文件:选项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("无效选项,请重新输入")

关键修改点说明

  1. 统一文件存储逻辑:将选项6和选项7合并为同一逻辑,均向contact_list.txt写入整个通讯录的所有联系人,确保文件始终是最新的全量数据,解决了原代码仅保存最后一条记录的问题。
  2. 优化存储格式:放弃直接写入字典字符串的方式,改为每行存储一个联系人的清晰格式,既方便人工查看,也便于后续读取解析。
  3. 新增加载功能:启动程序时自动从文件加载之前保存的通讯录,避免每次启动都丢失数据。
  4. 增强输入验证:添加电话号码长度验证,确保输入的号码符合常规格式;优化选项输入的异常处理,避免非数字输入导致程序崩溃。
  5. 简化确认逻辑:使用lower()统一处理用户输入的大小写,避免因输入YES或yes导致的判断错误。

内容的提问来源于stack exchange,提问作者NASAAndr3w07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:40:25