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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:21:44