Python实现命令行通讯录实例教程

何川
何川
发布时间:2026-10-12 | 2人浏览过
原创

通过Python内置库与面向对象设计,打造一款支持动态增删查改及本地文件持久化的命令行通讯录。本文提供从零到一的完整构建流程、可执行源码及终端交互验证,帮助开发者快速理解内存数据管理与状态控制的核心逻辑。

开发目标与系统设计

本实例旨在编写一个基于终端交互的通讯录管理工具,核心功能涵盖新增联系人、精准查询、按需删除以及安全退出。为了实现轻量级架构,程序采用字典作为底层存储容器,以姓名作为唯一索引键,并利用 pickle 模块将内存中的数据结构序列化至本地磁盘,从而实现跨会话的数据持久化。

命令行通讯录开发思维导图
整体架构设计:包含数据存储类、操作类与主循环控制流程。

核心逻辑与预处理步骤

在正式编码前,需明确程序的运行边界与数据流向。系统启动后首先检测是否存在历史数据文件,若存在则反序列化恢复至内存;若不存在则询问用户初始化并创建空模板。随后进入交互式命令循环,监听特定指令以触发对应的增删查改动作。为避免退出时丢失未保存记录,程序设计了两种终止路径:强制无保存退出与主动保存退出。

# 1. 初始化全局配置与数据存储容器
# 2. 定义 Person 类封装联系人属性(姓名、关系、电话)
# 3. 定义 Operation 类集中处理增、删、查、存、退等指令逻辑
# 4. 启动程序并检查本地数据文件 existence
# 5. 依据检测结果决定加载旧数据或创建新文件
# 6. 进入 while 主循环等待用户输入指令
# 7. 指令路由分发:
#    addperson → 添加新联系人
#    delperson → 移除指定联系人
#    search → 检索联系人详情
#    quit → 强制退出且不保存
#    sq → 写入文件后安全退出

完整代码实现

以下为整合上述逻辑的可运行源码。代码已修复原版中变量作用域导致的退出失效问题,并补全了异常捕获与上下文管理器以提升稳定性。

import pickle
import os

# 全局数据存储字典与枚举分组
person_data = {}
relationship_list = ['家人', '朋友', '同事']
running = True

class Person:
    def __init__(self, name, relationship='朋友', tel='None'):
        self.name = name
        self.relationship = relationship
        self.tel = tel
        person_data[name] = {'relationship': relationship, 'tel': tel}

class Operation:
    @staticmethod
    def add_person():
        name = input('请输入姓名:')
        if name in person_data:
            print('联系人已存在。')
            return
        try:
            rel_idx = int(input('请选择分组(0:家人,1:朋友,2:同事):'))
            rel = relationship_list[rel_idx]
        except (ValueError, IndexError):
            print('输入无效,默认设置为朋友。')
            rel = '朋友'
        tel = input('请输入电话:')
        Person(name, rel, tel)
        print(f'已成功添加 {name}。')

    @staticmethod
    def del_person():
        name = input('请输入要删除的联系人姓名:')
        if name in person_data:
            del person_data[name]
            print(f'已删除 {name}。')
        else:
            print('联系人不存在。')

    @staticmethod
    def search():
        name = input('请输入要查找的联系人的姓名:')
        if name in person_data:
            info = person_data[name]
            print(f'姓名:{name}, 关系:{info["relationship"]}, 电话:{info["tel"]}')
        else:
            print('联系人不存在。')

    @staticmethod
    def save_quit():
        global running
        addressbook_file = 'addressbook.data'
        with open(addressbook_file, 'wb') as f:
            pickle.dump(person_data, f)
        print('更改已保存并退出程序。')
        running = False

    @staticmethod
    def quit_no_save():
        global running
        print('未保存更改,直接退出程序。')
        running = False

# 主程序入口
if __name__ == '__main__':
    addressbook_file = 'addressbook.data'
    if os.path.exists(addressbook_file):
        with open(addressbook_file, 'rb') as f:
            person_data = pickle.load(f)
        print('已从本地文件加载通讯录数据。')
    else:
        create_input = input('未找到通讯录文件,是否创建?yes/no ')
        if create_input.lower() == 'yes':
            with open(addressbook_file, 'wb') as f:
                pickle.dump(person_data, f)
            print('通讯录文件已创建。')
        elif create_input.lower() != 'no':
            print('输入无效,将不创建文件。')
            running = False

    while running:
        command = input('请输入指令:').strip()
        if command == 'addperson':
            Operation.add_person()
        elif command == 'delperson':
            Operation.del_person()
        elif command == 'search':
            Operation.search()
        elif command == 'quit':
            Operation.quit_no_save()
        elif command == 'sq':
            Operation.save_quit()
        else:
            print('未找到指令!')

终端交互与持久化验证

将上述代码保存为 addressbook.py 后,在终端执行 python3 addressbook.py 即可启动。首次运行会提示创建数据文件,选择 yes 后会生成 addressbook.data 缓存。后续通过标准输入发送指令:

$ python3 addressbook.py
已从本地文件加载通讯录数据。
请输入指令:addperson
请输入姓名:zhangsan
请选择分组(0:家人,1:朋友,2:同事):1
请输入电话:1234567
已成功添加 zhangsan。
请输入指令:search
请输入要查找的联系人的姓名:zhangsan
姓名:zhangsan, 关系:朋友, 电话:1234567
请输入指令:sq
更改已保存并退出程序。

再次执行脚本时,程序会识别到已有的数据文件并自动载入 zhangsan 的信息,验证了 pickle 持久化机制的有效性。此时尝试删除或搜索其他记录即可完成闭环测试。

常见问题与排错建议

  • 退出后循环不终止:原设计中直接在方法内赋值 running = False 会创建局部变量,无法影响外部 while 循环。已在此处改为 global running 显式修改全局状态标志。
  • 文件读写权限报错:Windows 系统下某些保护目录禁止直接写入,请将脚本切换至具备完全读写权限的工作目录(如桌面或自定义项目文件夹)再运行。
  • 输入校验异常:关系分组输入非数字或越界时会抛出异常,当前代码已通过 try-except 捕获并回退至默认值,保障程序不崩溃。

总结

以上便是利用 Python 构建命令行通讯录的完整开发与调试指南。通过该实例,开发者能够直观掌握类设计、字典操作、文件序列化以及控制台交互流的编排方式。以上就是Python命令行通讯录开发的详细内容,更多关于Python基础实战的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表