如何实现Python控制台电话本的通讯录数据持久化至文本文件
嘿,这个需求其实挺常见的——就是要给你的电话本加上数据持久化能力,让内存里的联系人信息能存到本地文件,下次启动程序再读回来就行。我给你一套实用的实现方案,用JSON格式存储,简单好上手:
一、选对存储格式:用JSON最省心
JSON和Python的列表、字典天生兼容,存出来的文件可读性强,读写代码也简单。比如你的联系人可以存成这样的结构:
[ {"name": "张三", "phone": "13800138000"}, {"name": "李四", "phone": "13900139000"} ]
二、写两个核心工具函数:加载+保存
先封装两个基础函数,专门负责和文件打交道,这样业务逻辑和IO操作能分开,代码更清晰:
import json # 定义存储文件的路径,默认存在当前项目目录下的contacts.json CONTACTS_FILE = "contacts.json" def load_contacts(): """从文件加载联系人数据,文件不存在则返回空列表(第一次运行的情况)""" try: with open(CONTACTS_FILE, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: # 第一次运行没文件,直接返回空通讯录 return [] def save_contacts(contacts): """把内存里的联系人数据写入文件""" with open(CONTACTS_FILE, "w", encoding="utf-8") as f: # ensure_ascii=False保证中文不转成Unicode编码,indent=4让文件排版好看 json.dump(contacts, f, ensure_ascii=False, indent=4)
三、把持久化逻辑整合到你的功能里
接下来把这两个函数和你现有的5个功能结合,启动程序先加载数据,每次修改通讯录(新增、删除)后立刻保存到文件:
import json CONTACTS_FILE = "contacts.json" def load_contacts(): try: with open(CONTACTS_FILE, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: return [] def save_contacts(contacts): with open(CONTACTS_FILE, "w", encoding="utf-8") as f: json.dump(contacts, f, ensure_ascii=False, indent=4) def search_contact(contacts): name = input("请输入要搜索的联系人姓名:") for contact in contacts: if contact["name"] == name: print(f"找到联系人:{contact['name']} - {contact['phone']}") return print("未找到该联系人!") def add_contact(contacts): name = input("请输入联系人姓名:") # 先检查是否重复 for contact in contacts: if contact["name"] == name: print("该联系人已存在!") return phone = input("请输入联系人电话:") contacts.append({"name": name, "phone": phone}) save_contacts(contacts) # 新增后立刻保存 print("联系人录入成功!") def delete_contact(contacts): name = input("请输入要删除的联系人姓名:") for index, contact in enumerate(contacts): if contact["name"] == name: del contacts[index] save_contacts(contacts) # 删除后立刻保存 print("联系人删除成功!") return print("未找到该联系人!") def show_all_contacts(contacts): if not contacts: print("通讯录为空!") return print("全部联系人:") for i, contact in enumerate(contacts, 1): print(f"{i}. {contact['name']} - {contact['phone']}") def main(): # 程序启动第一步:加载本地存储的联系人 contacts = load_contacts() while True: print("\n===== 电话本控制台 =====") print("1. 搜索联系人") print("2. 录入联系人") print("3. 删除联系人") print("4. 查看全部电话") print("5. 退出") choice = input("请输入你的选择(1-5):") if choice == "1": search_contact(contacts) elif choice == "2": add_contact(contacts) elif choice == "3": delete_contact(contacts) elif choice == "4": show_all_contacts(contacts) elif choice == "5": print("程序已退出,再见!") break else: print("输入无效,请重新选择!") if __name__ == "__main__": main()
四、几个关键注意点
- 文件路径自定义:如果想把存在子目录里(比如
./data/contacts.json),记得先判断目录是否存在,可加一段代码:import os os.makedirs(os.path.dirname(CONTACTS_FILE), exist_ok=True) - 中文编码问题:打开文件时一定要指定
encoding="utf-8",不然中文可能会乱码 - 异常兜底:如果手动修改了
contacts.json导致格式错误,可以在load_contacts里加json.JSONDecodeError捕获,提示用户文件损坏并返回空列表
这样每次运行程序,都会先从本地文件加载之前保存的联系人,所有修改操作都会实时同步到文件里,完全满足你的需求~
内容的提问来源于stack exchange,提问作者Daraka BG
相关产品推荐
相关产品推荐

