Python写入文本通讯录表格重复建表及搜索功能实现方案问询
解决方案
优先推荐使用JSON存储通讯录数据,刚好适配你后续要做的姓名搜索需求,实现简单且维护成本低,完全可以避免多表格重复生成的问题。
实现逻辑
- 用JSON文件存储
姓名:地址的键值对结构,搜索时直接按键查询即可,无需解析格式化文本 - 每次新增联系人时先读取现有JSON数据,追加新条目后全量回写文件
- 需要导出可视化表格时,一次性把全部数据传入PrettyTable生成完整表格,写入单独的TXT文件即可
完整实现代码
import sys import json from prettytable import PrettyTable # 配置存储文件路径 DATA_FILE = "address_book.json" def load_data(): """加载现有通讯录数据""" try: with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) except FileNotFoundError: # 首次运行文件不存在时返回空字典 return {} def save_data(data): """保存通讯录数据到JSON文件""" with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) def menu(): print("0- 退出 \n1 - 新增联系人 \n2 - 搜索地址 \n3 - 导出全部表格到TXT") choice = int(input("请输入选择: ")) if choice == 1: add_contact() elif choice == 2: search_address() elif choice == 3: export_table() else: sys.exit() def add_contact(): data = load_data() while True: name = input("输入姓名(输入0返回菜单): ") if name == "0": save_data(data) menu() return if name in data: print("该姓名已存在,可直接搜索或更换其他姓名") continue addr = input("输入地址: ") data[name] = addr print("添加成功") def search_address(): data = load_data() name = input("输入要查询的姓名: ") if name in data: print(f"{name} 的地址是: {data[name]}") else: print("未找到该联系人") input("按任意键返回菜单") menu() def export_table(): data = load_data() table = PrettyTable(["姓名", "地址"]) for name, addr in data.items(): table.add_row([name, addr]) with open("address_table.txt", "w", encoding="utf-8") as f: f.write(str(table)) print("表格已导出到 address_table.txt") input("按任意键返回菜单") menu() if __name__ == "__main__": menu()
优势说明
- 数据结构清晰,修改、删除、查询操作都可以直接操作字典实现,不需要处理文本格式
- 导出的TXT表格永远是完整的单表,不会出现多表重复、边框错位的问题
- 搜索功能直接实现,效率远高于解析TXT表格
如果你一定要坚持用TXT直接追加表格的方式,可以在首次写入时生成表头和边框,后续新增时只写入对应长度的行内容和分隔线,但这种方式需要严格控制行内容长度,一旦姓名/地址长度变化就会导致表格错位,实用性很低,不推荐使用。
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

