Python实现命令行通讯录实例教程
通过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基础实战的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









