# === 第10课:综合实战 - 完整版通讯录系统 ===
import os
import json
# 文件路径
DIR = os.path.dirname(os.path.abspath(__file__))
DATA_FILE = os.path.join(DIR, "contacts.json")
# 1. 联系人类(第9课:面向对象)
class Contact:
def __init__(self, name, phone, email="", group="默认"):
self.name = name
self.phone = phone
self.email = email
self.group = group
def __str__(self):
return f"{self.name} | {self.phone} | {self.email} | {self.group}"
# 2. 通讯录管理类(第9课:面向对象 + 第5课:函数)
class ContactBook:
def __init__(self):
self.contacts = [] # 第4课:列表
self.load() # 第7课:文件读取
# 添加联系人
def add(self, contact):
for c in self.contacts: # 第3课:for循环
if c.name == contact.name: # 第2课:条件判断
print(f"{contact.name} 已存在!")
return
self.contacts.append(contact)
print(f"已添加:{contact.name}")
self.save()
# 删除联系人
def delete(self, name):
for c in self.contacts:
if c.name == name:
self.contacts.remove(c)
print(f"已删除:{name}")
self.save()
return
print(f"未找到:{name}")
# 查找联系人(第6课:字符串操作)
def search(self, keyword):
keyword = keyword.lower() # 第6课:大小写转换
results = []
for c in self.contacts:
if (keyword in c.name.lower() or
keyword in c.phone or
keyword in c.email.lower()):
results.append(c)
return results
# 显示所有联系人
def show_all(self):
if not self.contacts:
print("通讯录为空")
return
# 按分组整理(第4课:字典)
groups = {}
for c in self.contacts:
if c.group not in groups:
groups[c.group] = []
groups[c.group].append(c)
# 第4课:字典遍历
for group_name, members in groups.items():
print(f"\n【{group_name}】")
for c in members:
print(f" {c}")
# 保存到文件(第7课:文件写入 + 第8课:异常处理)
def save(self):
try:
data = []
for c in self.contacts:
data.append({
"name": c.name,
"phone": c.phone,
"email": c.email,
"group": c.group
})
with open(DATA_FILE, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
except Exception as e:
print(f"保存失败:{e}")
# 从文件加载(第7课:文件读取 + 第8课:异常处理)
def load(self):
try:
if os.path.exists(DATA_FILE):
with open(DATA_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
for item in data:
c = Contact(
item["name"],
item["phone"],
item.get("email", ""),
item.get("group", "默认")
)
self.contacts.append(c)
except FileNotFoundError:
self.contacts = []
except json.JSONDecodeError:
print("数据文件损坏,从空通讯录开始")
self.contacts = []
# 3. 主程序菜单(第2课:条件判断 + 第3课:while循环)
def main():
book = ContactBook()
while True:
print("\n" + "=" * 30)
print(" 通讯录管理系统")
print("=" * 30)
print("1. 添加联系人")
print("2. 删除联系人")
print("3. 查找联系人")
print("4. 显示所有联系人")
print("5. 退出")
print("=" * 30)
choice = input("请选择(1-5):")
if choice == "1":
name = input("姓名:").strip() # 第6课:strip去空白
phone = input("电话:").strip()
# 第8课:输入验证
if not phone.isdigit(): # 第6课:isdigit
print("电话必须是数字!")
continue # 第3课:continue
email = input("邮箱(可留空):").strip()
group = input("分组(可留空,默认"默认"):").strip()
if not group:
group = "默认"
c = Contact(name, phone, email, group)
book.add(c)
elif choice == "2":
name = input("要删除的姓名:").strip()
book.delete(name)
elif choice == "3":
keyword = input("搜索关键词:").strip()
results = book.search(keyword)
if results:
print(f"找到 {len(results)} 个结果:")
for c in results:
print(f" {c}")
else:
print("没有找到匹配的联系人")
elif choice == "4":
book.show_all()
elif choice == "5":
book.save()
print("数据已保存,再见!")
break # 第3课:break
else:
print("无效选择,请输入1-5")
# 4. 启动程序
if __name__ == "__main__":
main()
未经允许不得转载:百花谷博客 » 跟着AI学Python 综合实战

百花谷博客
微信关注,获取更多