在最原始的通讯录的基础之上进行了改进
使用了text文本记录数据
之后打算再研究一下用tkinter怎么写出有界面的通讯录(还是用text文本记录数据),然后再考虑一下用pymysql数据库记录数据,单纯只是完成一下期末老师布置的作业····
上篇的通讯录Python 最简单的实例:手机通讯录
import sys
import json
import os
class TelephoneBook:
def show_menu(self): # 用于界面展示
print("*" * 20)
print("欢迎使用[通讯录] V1.0")
print("1.添加联系人")
print("2.查看通讯录")
print("3.删除联系人")
print("4.修改联系人")
print("5.查找联系人")
print("6.退出")
print("*" * 20)
# 1-添加联系人
def add_info(self):
name_str = input("请输入姓名:")
phone_num = input("请输入手机号:")
mail_adr = input("请输入邮箱:")
adr_str = input("请输入地址:")
# 将数据封装到字典中
card_dict = {"姓名": name_str, "手机号": phone_num,
"邮箱": mail_adr,"地址": adr_str}
f = open("通讯录.txt", mode='a+', encoding='utf-8')
# 将字典转换为str,然后再使用write()写入到通讯录的文本文件中
f.write(str(card_dict) + '\n')
f.close()
print(f"成功添加{name_str}为联系人")
# 2-显示所有联系人信息
def show_info(self):
file = open("通讯录.txt", mode='r', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
# 保证每次从开始位置读取
file.seek(0, 0)
# 读取通讯录.txt文件中的内容
file_data = file.read()
# 对字符串进行分隔
split_info = file_data.split('\n')
# 删除多余的字符串
split_info.remove(split_info[len(split_info) - 1])
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
# 将单引号替换为双引号
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
# 获取所有联系人的姓名
name_li.append(dict_info['姓名'])
for person_info in all_info_li:
print('--*' * 17)
print(person_info)
print('--*' * 17+'\n')
else:
print("通讯录为空")
# 3-删除联系人信息
def del_info(self):
file = open("通讯录.txt", mode='r+', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
# 保证每次从开始位置读取
file.seek(0, 0)
# 读取通讯录.txt文件中的内容
file_data = file.read()
# 对字符串进行分隔
split_info = file_data.split('\n')
# 删除多余的字符串
split_info.remove(split_info[len(split_info) - 1])
name = input("请输入要删除的联系人姓名:")
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
# 将单引号替换为双引号
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
# 获取所有联系人的姓名
name_li.append(dict_info['姓名'])
if name in name_li:
通讯录_copy = open('通讯录_copy.txt', mode='w', encoding="utf-8")
for person_info in all_info_li:
if name not in str(person_info):
通讯录_copy.write(str(person_info)+'\n')
通讯录_copy.close()
file.close()
os.rename('通讯录.txt', '通讯录_del.txt')
os.rename('通讯录_copy.txt', '通讯录.txt')
os.remove('通讯录_del.txt')
print('删除成功!')
else:
print('联系人不存在')
else:
print("通讯录为空")
# 4-更新联系人信息
def update_info(self):
file = open("通讯录.txt", mode='r+', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
# 保证每次从开始位置读取
file.seek(0, 0)
# 读取通讯录.txt文件中的内容
file_data = file.read()
# 对字符串进行分隔
split_info = file_data.split('\n')
# 删除多余的字符串
split_info.remove(split_info[len(split_info) - 1])
name = input("请输入要更新的联系人姓名:")
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
# 将单引号替换为双引号
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
# 获取所有联系人的姓名
name_li.append(dict_info['姓名'])
if name in name_li:
通讯录_copy = open('通讯录_copy.txt', mode='w', encoding="utf-8")
name_new = input("请输入新的姓名:")
phone_new = input("请输入新的手机号:")
mail_new = input("请输入新的邮箱:")
adr_new = input("请输入新的地址:")
# 将数据封装到字典中
card_dict = {"姓名": name_new, "手机号": phone_new,
"邮箱": mail_new, "地址": adr_new}
for person_info in all_info_li:
if name in str(person_info):
person_info = str(card_dict)
通讯录_copy.write(str(person_info) + '\n')
通讯录_copy.close()
file.close()
os.rename('通讯录.txt', '通讯录_del.txt')
os.rename('通讯录_copy.txt', '通讯录.txt')
os.remove('通讯录_del.txt')
print('更新成功!')
else:
print('联系人不存在')
else:
print("通讯录为空")
# 5-查找相关联系人信息
def find_info(self):
file = open("通讯录.txt", mode='r', encoding='utf-8')
# 如果通讯录.txt文件不为空时,执行下面代码
if len(file.read()) != 0:
# 保证每次从开始位置读取
file.seek(0, 0)
# 读取通讯录.txt文件中的内容
file_data = file.read()
# 对字符串进行分隔
split_info = file_data.split('\n')
# 删除多余的字符串
split_info.remove(split_info[len(split_info) - 1])
name = input("请输入要查询的姓名:")
name_li = [] # 用于存储联系人姓名的列表
all_info_li = [] # 用于存储所有信息的列表
for i in split_info:
# 将单引号替换为双引号
dict_info = json.loads(i.replace("\'", '\"'))
all_info_li.append(dict_info)
# 获取所有联系人的姓名
name_li.append(dict_info['姓名'])
if name in name_li:
for person_info in all_info_li:
for title_key, name_value in person_info.items():
if name_value == name:#找到匹配的名字并输出相关信息
for title, info_value in person_info.items():
print(title + ":" + info_value)
else:
print('联系人不存在')
else:
print("通讯录为空")
# 主函数
def main(self):
while True:
self.show_menu()
action_str = input("请选择操作功能:") # 判断用户输入的功能指令
if action_str.isdigit() is True:
if int(action_str) == 1:
self.add_info()
elif int(action_str) == 2:
self.show_info()
elif int(action_str) == 3:
self.del_info()
elif int(action_str) == 4:
self.update_info()
elif int(action_str) == 5:
self.find_info()
elif int(action_str) == 6:
sys.exit()
else:
print('请输入正确的指令')
#执行主程序
if __name__ == '__main__':
tb = TelephoneBook()
tb.main()