Python 基于列表实现的通讯录管理系统(有完整源码)

目录

通讯录管理系统

PersonInformation类

ContactList类

main函数

程序的运行流程

完整代码

运行示例


通讯录管理系统

这是一个基于文本的界面程序,用户可以通过命令行与之交互,它使用了CSV文件来存储和读取联系人信息,这使得数据可以持久化保存。此外,程序还提供了一些基本的输入验证,以确保输入的数据是有效的。

它包含了两个类PersonInformation类用于创建和管理个人信息对象,而ContactList类则用于管理这些对象的集合。

PersonInformation

这个类用于存储一个人的基本信息,包括姓名、性别、年龄、电话和住址。它有一个__str__方法,用于定义当对象被转换为字符串时的表现形式。

class PersonInformation:def __init__(self, name, gender, age, telephone, address):self.name = nameself.gender = genderself.age = ageself.telephone = telephoneself.address = addressdef __str__(self):return f"名字: {self.name}, 性别: {self.gender}, 年龄: {self.age}, 电话: {self.telephone}, 住址: {self.address}"

ContactList

这个类用于管理一个联系人列表。它提供了以下功能:

  • 添加联系人(add_contact
  • 删除联系人(remove_contact
  • 查找联系人(find_contact
  • 修改联系人信息(modify_contact
  • 显示所有联系人(show_contacts
  • 保存联系人到CSV文件(save_contacts
  • 从CSV文件加载联系人(load_contacts
class ContactList:def __init__(self):self.arr = []def add_contact(self, person):self.arr.append(person)self.save_contacts()def is_empty(self):if not self.arr:print("当前联系人列表为空!")def remove_contact(self, name):person = self.find_contact(name)if person:self.arr.remove(person)self.save_contacts()print("删除成功!")self.is_empty()else:print("此联系人不存在!")def show_contacts(self):print('通讯录:')for person in self.arr:print(person)self.is_empty()def find_contact(self, name):for person in self.arr:if person.name == name:return personreturn Nonedef modify_contact(self, old_name, new_info):person = self.find_contact(old_name)if person:person.name = new_info.nameperson.gender = new_info.genderperson.age = new_info.ageperson.telephone = new_info.telephoneperson.address = new_info.addressself.save_contacts()print("修改成功!\n ", person)else:print("此联系人不存在!")def save_contacts(self, filename="contacts.csv"):with open(filename, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['姓名', '性别', '年龄', '电话', '住址'])for person in self.arr:writer.writerow([person.name, person.gender, person.age, person.telephone, person.address])def load_contacts(self, filename="contacts.csv"):if not os.path.isfile(filename):with open(filename, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['姓名', '性别', '年龄', '电话', '住址'])with open(filename, 'r', newline='', encoding='utf-8') as f:reader = csv.reader(f)next(reader)for row in reader:if len(row) == 5:name, gender, age, telephone, address = rowself.add_contact(PersonInformation(name, gender, age, telephone, address))else:print(f"跳过不完整的联系人记录: {row}")

这个函数用于显示程序的菜单选项,让用户可以选择执行不同的操作。

main函数

这是程序的主入口,它首先创建一个ContactList实例,然后进入一个无限循环,不断显示菜单并根据用户的选择调用相应的方法。当用户选择退出时,程序会结束。

程序的运行流程

  1. 程序启动后,首先加载已有的联系人信息。
  2. 显示菜单,等待用户输入选择。
  3. 根据用户的选择执行相应的操作:
    • 添加联系人:输入新的联系人信息并添加到列表中。
    • 删除联系人:输入要删除的联系人姓名,然后从列表中删除。
    • 查找联系人:输入要查找的联系人姓名,并显示其信息。
    • 修改联系人:输入要修改的联系人姓名,然后输入新的信息进行修改。
    • 显示所有联系人:列出当前所有的联系人信息。
    • 退出通讯录:退出程序。

完整代码

import os, csvclass PersonInformation:def __init__(self, name, gender, age, telephone, address):self.name = nameself.gender = genderself.age = ageself.telephone = telephoneself.address = addressdef __str__(self):return f"名字: {self.name}, 性别: {self.gender}, 年龄: {self.age}, 电话: {self.telephone}, 住址: {self.address}"class ContactList:def __init__(self):self.arr = []def is_full(self):return self.num == self.capacitydef add_contact(self, person):self.arr.append(person)self.save_contacts()def is_empty(self):if not self.arr:print("当前联系人列表为空!")def remove_contact(self, name):person = self.find_contact(name)if person:self.arr.remove(person)self.save_contacts()print("删除成功!")self.is_empty()else:print("此联系人不存在!")def show_contacts(self):print('通讯录:')for person in self.arr:print(person)self.is_empty()def find_contact(self, name):for person in self.arr:if person.name == name:return personreturn Nonedef modify_contact(self, old_name, new_info):person = self.find_contact(old_name)if person:person.name = new_info.nameperson.gender = new_info.genderperson.age = new_info.ageperson.telephone = new_info.telephoneperson.address = new_info.addressself.save_contacts()print("修改成功!\n ", person)else:print("此联系人不存在!")def save_contacts(self, filename="contacts.csv"):with open(filename, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['姓名', '性别', '年龄', '电话', '住址'])for person in self.arr:writer.writerow([person.name, person.gender, person.age, person.telephone, person.address])def load_contacts(self, filename="contacts.csv"):if not os.path.isfile(filename):with open(filename, 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(['姓名', '性别', '年龄', '电话', '住址'])with open(filename, 'r', newline='', encoding='utf-8') as f:reader = csv.reader(f)next(reader)for row in reader:if len(row) == 5:name, gender, age, telephone, address = rowself.add_contact(PersonInformation(name, gender, age, telephone, address))else:print(f"跳过不完整的联系人记录: {row}")def menu(contact_list):print()print("*********************************")print("** 1、增加联系人 2、删除联系人 **")print("** 3、查找联系人 4、修改联系人 **")print("** 5、展示联系人 0、退出通讯录 **")print("*********************************")def main():contact_list = ContactList()contact_list.load_contacts()while True:menu(contact_list)name, gender, age, telephone, address = [""]*5input_choice = input("请输入您的选择:")if input_choice == '1':while len(name)<2:name = input("请输入您要添加的联系人的姓名:\n")if contact_list.find_contact(name):print(f'此姓名[{name}]已存在!')breakwhile gender not in ('男','女','1','0'):gender = input("请输入性别(1-男, 0-女):\n")if gender=='1': gender = '男'elif gender=='0': gender = '女'while not age.isnumeric():age = input("请输入年龄:\n")while telephone is None or len(telephone)!=11 or not telephone.startswith('1'):telephone = input("请输入手机号:\n")while len(address)<6:address = input("请输入住址(字数不少于6):\n")contact_list.add_contact(PersonInformation(name, gender, age, telephone, address))print("联系人添加成功!")elif input_choice == '2':name = input("请输入您要删除的联系人的名字:\n")contact_list.remove_contact(name)elif input_choice == '3':name = input("请输入您要查找的联系人的名字:\n")person = contact_list.find_contact(name)print(person if person else "此联系人不存在!")elif input_choice == '4':old_name = input("请输入您要修改的联系人的名字:\n")new_info = PersonInformation(*([""]*5))person = contact_list.find_contact(old_name)if person:print('待修改联系人:(直接回车保留原字段)\n ', person)while len(new_info.name)<2:new_info.name = input("请输入新的名字:\n")if new_info.name=="":new_info.name = person.nameelif contact_list.find_contact(name):print(f'此姓名[{name}]已存在,退出修改!')breakwhile new_info.gender not in ('男','女','1','0'):new_info.gender = input("请输入性别(1-男, 0-女):\n")if new_info.gender=='1': new_info.gender = '男'elif new_info.gender=='0': new_info.gender = '女'elif new_info.gender=="":  new_info.gender = person.genderwhile not new_info.age.isnumeric():new_info.age = input("请输入年龄:\n")if new_info.age=="": new_info.age = person.agewhile len(new_info.telephone)!=11 or not new_info.telephone.startswith('1'):new_info.telephone = input("请输入新的手机号:\n")if new_info.telephone=="": new_info.telephone = person.telephonewhile len(new_info.address)<6:new_info.address = input("请输入新的住址(字数不少于6):\n")if new_info.address=="": new_info.address = person.addresscontact_list.modify_contact(old_name, new_info)elif input_choice == '5':contact_list.show_contacts()elif input_choice == '0':print("成功退出通讯录!")breakelse:print("输入错误,请重新选择!")if __name__ == "__main__":main()

运行示例

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:5
通讯录:
当前联系人列表为空!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:1
请输入您要添加的联系人的姓名:
Hann
请输入性别(1-男, 0-女):
1
请输入年龄:
51
请输入手机号:
13962600000
请输入住址(字数不少于6):
江苏省昆山市
联系人添加成功!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:5
通讯录:
名字: Hann, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:1
请输入您要添加的联系人的姓名:
Hann
此姓名[Hann]已存在!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:1
请输入您要添加的联系人的姓名:
YangCheng
请输入性别(1-男, 0-女):
1
请输入年龄:
22
请输入手机号:
13962611111
请输入住址(字数不少于6):
江苏省昆山市
联系人添加成功!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:5
通讯录:
名字: Hann, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市
名字: YangCheng, 性别: 男, 年龄: 22, 电话: 13962611111, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:4
请输入您要修改的联系人的名字:
Hann
待修改联系人:(直接回车保留原字段)
  名字: Hann, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市
请输入新的名字:
HannYang
请输入性别(1-男, 0-女):

请输入年龄:

请输入新的手机号:

请输入新的住址(字数不少于6):

修改成功!
  名字: HannYang, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:5
通讯录:
名字: HannYang, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市
名字: YangCheng, 性别: 男, 年龄: 22, 电话: 13962611111, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:3
请输入您要查找的联系人的名字:
hannyang
此联系人不存在!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:3
请输入您要查找的联系人的名字:
HannYang
名字: HannYang, 性别: 男, 年龄: 51, 电话: 13962600000, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:2
请输入您要删除的联系人的名字:
hann
此联系人不存在!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:2
请输入您要删除的联系人的名字:
HannYang
删除成功!

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:5
通讯录:
名字: YangCheng, 性别: 男, 年龄: 22, 电话: 13962611111, 住址: 江苏省昆山市

*********************************
** 1、增加联系人 2、删除联系人 **
** 3、查找联系人 4、修改联系人 **
** 5、展示联系人 0、退出通讯录 **
*********************************
请输入您的选择:0
成功退出通讯录!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596015.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源数学计算软件Maxima基础学习

在Maxima中计算四则运算可以直接使用数学符号&#xff0c;在输入完公式后使用 EnterShift 快捷键进行计算 (%i1)11 输出 (%o1)2 这里面的 (%i1) 代表 input1 第1号输入&#xff0c;(%o1) 代表 output1 第1号输出。在执行计算后&#xff0c;(%i1)11 这一行命令后会出现一个…

2_5.Linux存储的基本管理

实验环境&#xff1a; 系统里添加两块硬盘 ##1.设备识别## 设备接入系统后都是以文件的形式存在 设备文件名称&#xff1a; SATA/SAS/USB /dev/sda,/dev/sdb ##s SATA, dDISK a第几块 IDE /dev/hd0,/dev/hd1 ##h hard VIRTIO-BLOCK /de…

【Python毕业设计】Python二手房拍卖网抓取工具设计与实现(源码+毕业论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【攻防世界】FlatScience

dirsearch 扫描发现四个文件 在login.php 中发现 输入 http://61.147.171.105:61912/login.php/?debug 发现源码 <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3(../fancy.db);$res $db->query(…

SpringBoot新增员工模块开发

需求分析与设计 一&#xff1a;产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。 后台系统中可以管理员工信息&#xff0c;通过新增员工来添加后台系统用户。 新增员工原型&#xf…

设置你的第一个React应用

目录 一、React入门 1.1 你好React 1.2 创建React 1.3 应用结构 二、总结 2.1 定义组件 2.2 组件源码 三、组件详解 注意事项 3.1 组件三部曲 3.2 组件通信 —— props 3.3 对象数组迭代 —— map() 3.4 事件处理 3.5 钩子函数 —— useState() 初次学习最终效果…

深入浅出 -- 系统架构之负载均衡Nginx环境搭建

引入负载均衡技术可带来的收益&#xff1a; 系统的高可用&#xff1a;当某个节点宕机后可以迅速将流量转移至其他节点。系统的高性能&#xff1a;多台服务器共同对外提供服务&#xff0c;为整个系统提供了更高规模的吞吐。系统的拓展性&#xff1a;当业务再次出现增长或萎靡时…

重点:二维数组首地址的三种表示方式

上代码&#xff1a; 1. 表示子数组首地址的三种方法&#xff1a; arr是父亲地址 arr[0]是子数组的数组名 难点&#xff1a;arr[0] 是子数组的首地址 等价于 *(arr0) :0行0列 为什么等价呢&#xff1f; 因为当arr是二维数组的时候 *arr取的是列&#xff0c;子数组的地…

碘浊度法与红外相机联用测定食品中维生素C

&#x1f31e;欢迎来到看论文的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年4月6日&…

【智能排班系统】AOP实现操作日志自动记录

文章目录 操作日志介绍自动保存操作日志基本实现思路定义注解枚举业务类型枚举操作人员类型枚举 AOP具体实现方法上添加注解 日志增删改查日志表sql实体类ServiceControllerVo 操作日志介绍 操作日志是对系统或应用程序中所有用户操作、系统事件、后台任务等进行详细记录的文本…

文心一言指令词宝典之营销文案篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…

【简单讲解下epoll】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…