微信关注,获取更多

跟着AI学Python 综合实战

# === 第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 综合实战

评论

4+3=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏