【名片管理系统】
(作业小练习)
☆程序调试环境☆
python 3.6.6 安卓版(手机)
知识点: json数据的写入文件和读取,数据类型dict的使用。
技巧: 千万不要对转换后的json字符串尝试更改,您会在恢复数据时失败(我试过,酸爽度极高!😀)
My python code
主程序代码
#!/sur/bin/nve python
# coding: utf-8
#加载自定义cards_tools功能模块
import cards_tools as ct
"""
加载time模块,需调用time.sleep(second)暂停程序
加载sys,要借用sys.exit()退出本系统(也可以直接用quit()退出本系统)
"""
import time, sys
"""
【名片管理系统】主模块。
函数列表
0. 系统菜单 cards_menu()
1. 菜单选择 choice_menu()
2. 判断菜单 ismenu()
"""
pass
s = """
本系统是学习练习,代码是边看书边码码完成,由所学太少限制,代码繁复,不够简练。以后学得多些,再改写🧐。
本系统能实现对名片数据进行“增、删、改、查、显”的基本管理操作。每次对数据修改后,都会立即调用cards_save()将“增、删、改”后dict数据,用json格式写入目标文件保存。每次结束访问本系统,点选退出系统,程序都会对名片数据作存储操作,保证数据安全存储。(Tip: 每次对数据存储,都是覆盖式写入——调试之前用的追加,造成json数据恢复失败。特别注意:千万不要尝试对json存储数据进行人为修改,那样子搞,会造成*son.loads(s)恢复失败,我是吃过亏花了五天冤枉时间。😭您可以试试,滋味倍儿酸爽😁。我是尝试在每条记录后写入换行符'\n',想当然认为方便查阅。😎其实,json把中文字符转码后存储的,怎么“阅”!我想多了。😀)
名片数据用json数据文件保存在本程序当前目录,文件名为cards_data.db。run本程序,系统检查当前目录,如cards_data.db文件存在,读出json数据,还原成dict。如无名片数据存储文件,则创建名片数据空dict。
名片dict存储格式为:
{name:{tel:phone number,
QQ:QQ number,
email:email drass}}
如:
{刘全:{电话:133****0890,
QQ:479469838,
邮箱:133****0890@189.cn}}
"""
#0. 系统菜单
def cards_menu():
s = "【名片管理系统】"
print("\n"*2, s.rjust(19), "\n"*2)
menu_list = ["1. 新增名片", "2. 显示全部", "3. 查询名片", "4. 修改名片", "5. 名片删除", "6. 其他信息", "0. 退出系统"]
for i in menu_list:
if menu_list.index(i)%2==0: print(i.rjust(16), end=" ")
else: print(i.ljust(16), end="\n")
if __name__=="__main__":
cards_menu()
#1. 用户选择菜单
def choice_menu():
while True:
print("\n"*2)
s = "请选择菜单:"
flag = input(s.rjust(len(s)+12))
if flag in ["1", "2", "3", "4", "5", "6", "0"]: return flag
else:
print("\n"*2, "菜单选择错误!".center(36), "\n")
print("壹秒后继续……".center(36))
time.sleep(1)
continue
if __name__=="__main__":
flag = choice_menu()
#2. 判断用户选择菜单
def ismenu(flag, s):
if flag=="6": ct.info(s, 20)
elif flag=="1": ct.card_new()
elif flag=="2": ct.show_all()
elif flag=="3": ct.card_search()
elif flag=="4": ct.card_alter()
elif flag=="5": ct.card_del()
elif flag=="0":
#退了【名片管理系统】前,存储数据
ct.cards_save()
s = "欢迎再次使用【名片管理系统】。"
print("\n"*3, s.rjust(len(s)+6), "\n")
print("\n", "壹秒后退出……".center(36), "\n")
time.sleep(1)
sys.exit()
#也可以用quit()退出系统
if __name__=="__main__":
ismenu(flag, s)
#main
#程序永久循环,用户指令退出
while True:
#调用函数,显示系统菜单
cards_menu()
#调用函数,用户菜单选择
flag = choice_menu()
#调用函数,判断用户选择菜单
ismenu(flag, s)
运行效果
My python code
功能模块代码
#! /sur/bin/nve python
# coding: utf-8
"""
加载time,要用到time.sleep()暂停显示提示
加载json,用json.dump(s, f)保存新增名片
加载glob, 用glob.glob()获取名片数据文件名
"""
import time, json, glob
#get “cards_data.db” filename list(获取名片数据存储文件名列表)
isfile = glob.glob("cards_data.db")
#名片数据文件存在,读取文件数据(json)
if isfile!=[]:
cards_json = json.load(open("cards_data.db"))
#恢复名片数据为dict
cards_dict = json.loads(cards_json)
#名片数据文件不存在,初始化名片数据duct为空
else: cards_dict = {}
"""
【名片管理工具】
1. 新增名片 card_new()
数据存储 cards_save()
2. 显示全部 show_all()
名片打印 cards_print(cards_dict)
3. 查询名片 card_search()
4. 修改名片 card_alter()
5. 名片删除 card_del()
6. 退出系统 sys.exit()
0. 其他信息 info(s, n)
"""
#名片数据存储
def cards_save():
#转换名片数据为json字符串
cards_json = json.dumps(cards_dict)
#写入名片存储数据文件
json.dump(cards_json, open("cards_data.db", "w"))
if __name__=="__main__":
cards_save()
#1. 新增名片
def card_new():
#信息录入
#datain(s), 信息录入函数
#姓名下仅添加了“电话、QQ和邮箱”
#可以根据需要添加
print("\n"*3, "【新增名片】".center(36), "\n"*2)
def datain(s):
print("\n")
return input(s.rjust(12))
name = datain("1.姓名:")
tel = datain("2.电话:")
qq = datain("3.QQ:")
email = datain("4.邮箱:")
#录入信息检查
print("\n")
s = '按相应序号修改,“0”继续……'
#检查输入,不符报错
while True:
is_ok = input(s.center(36)).strip()
for i in is_ok:
if i in ["0", "1", "2", "3", "4"]:
break
else:
print("\n"*2)
print("键入错误,请重新键入!".center(36))
continue
break
print("\n"*2)
print('(修改多项,直接键入。如“1234”)'.center(40))
for i in is_ok:
if i=="1": name = datain("姓名:")
elif i=="2": tel = datain("电话:")
elif i=="3": qq = ("QQ:")
elif i=="4": email = datain("邮箱:")
top = "电话", "QQ", "邮箱"
info = tel, qq, email
data = {x:y for x,y in zip(top, info)}
#新增名片,追加名片dict
cards_dict[name] = data
#调用函数打印新增名片
#存入dict
print("\n"*3, "新增名片成功!".center(36), "\n"*2)
card_new = {name:cards_dict[name]}
#调用函数打印新增名片
cards_print(card_new)
print("\n"*2)
input("任意键继续……".center(36))
#调用函数,存储数据
cards_save()
if __name__=="__main__":
card_new()
#名片打印
def cards_print(cards_dict):
print("\n"*2)
#设置显示宽度
name_n = 8
tel_n = 15
qq_n = 20
email_n = 28
print("姓名".center(name_n-2), "电话".center(tel_n), "QQ".center(qq_n+4), "邮箱".center(email_n))
print("━"*66)
#打印一条名片记录
for name in cards_dict.keys():
#打印“姓名”
print(name.center(name_n-len(name)), end="")
#获取“姓名”下“信息”列表
info_list = list(cards_dict[name].values())
#打印“信息”
#电话
print("│"+" "*4+info_list[0].ljust(tel_n), end="")
#QQ
print("│"+" "*4+info_list[1].ljust(qq_n), end="")
#邮箱
print("│"+" "*4+info_list[2].ljust(email_n),end="")
#打印完一条名片数据换行
print("\n")
#打印分隔线
print("─"*66)
if __name__=="__main__":
cards_print(cards_dict)
#2. 显示全部
def show_all():
#打印表头
if cards_dict!={}:
print("\n"*3, "【所有名片列表】".center(65))
print("\n"*2)
#打调用函数,印名片
cards_print(cards_dict)
else:
print("\n"*3, "名片库还没有名片!".center(36))
print("\n", '选择菜单“1”添加吧。'.center(36))
input("任意键继续……".center(66))
if __name__=="__main__":
show_all()
#3. 名片查询
def card_search():
while True:
print("\n"*3, "【名片查询】".center(36), "\n"*2)
name = input("姓名:".rjust(12))
if name not in cards_dict.keys():
print("\n"*2, '名片库中无此名片!'.center(36))
print("\n"*2, "1. 重新输入 0. 返回主菜单".center(36))
yes = input("选择:".rjust(16))
if yes=="1": continue
elif yes=="0": break
else:
print("\n"*2, "输入错误,请重新输入!".center(36))
time .sleep(1)
continue
else:
#从名片库提取要查找姓名的info
#存入dict
card_dict = {name:cards_dict[name]}
#调用函数打印所查名片
cards_print(card_dict)
input("任意键继续……".center(36))
break
if __name__=="__main__":
card_search()
#4. 名片修改
def card_alter():
#信息输入函数
def datain(s):
print("\n")
return input(s.rjust(12))
def alter(card_alter):
#把要修改的信息赋值给变量
name = list(card_alter.keys())[0]
info_dict = card_alter.get(name)
info = list(info_dict.values())
tel = info[0]
qq = info[1]
email = info[2]
while True:
print("【名片修改——%s】"%name.center(36))
print("\n"*2)
print("1. 电话 2. QQ".center(36))
print("\n"*2)
print("3. 邮箱 0. 返回".center(36))
print("\n"*2)
k = input("请选择:".rjust(12))
if k not in ["1", "2", "3", "0"]:
print("\n")
print("选择错误!请重新选择。".center(36))
continue
elif k=="1": tel = datain("电话:")
elif k=="2": qq = datain("QQ:")
elif k=="3": email = datain("邮箱:")
elif k=="0": break
top = "电话", "QQ", "邮箱"
info = tel, qq, email
data = {x:y for x,y in zip(top, info)}
#修改后名片,追加名片dict
cards_dict[name] = data
while True:
print("\n"*3, "【名片修改】".center(36), "\n"*2)
name = input("姓名:".rjust(12))
if name not in cards_dict.keys():
print("\n"*2, '名片库中无此名片!'.center(36))
print("\n"*2, "1. 重新输入 0. 返回上级菜单".center(36))
yes = input("选择:".rjust(16))
if yes=="1": continue
elif yes=="0": break
else:
print("\n"*2, "输入错误,请重新输入!".center(36))
continue
else:
#从名片库提取要修改姓名的info
card_alter = {name:cards_dict[name]}
#调用函数打印即将修改的名片
cards_print(card_alter)
while True:
print("\n"*2, "1. 修改 0. 返回".center(36), "\n"*2)
yes = input("选择:".rjust(16))
if yes not in ("1", "0"):
print("\n"*2)
print("选择错误!".center(36))
else: break
if yes=="1":
#调用函实施数修改名片
alter(card_alter)
print("\n"*2, "名片已成功修改。".center(36))
print("\n"*2)
print("两秒后继续……".center(36))
time.sleep(2)
break
elif yes=="0": break
if __name__=="__main__":
card_alter()
#5. 名片删除
def card_del():
while True:
print("\n"*2, "【名片删除】".center(36), "\n"*2)
name = input("姓名:".rjust(12))
if name not in cards_dict.keys():
print("\n"*2, '名片库中无此名片!'.center(36))
print("\n"*2, "1. 重新输入 0. 返回主菜单".center(36))
yes = input("选择:".rjust(16))
if yes=="1": continue
elif yes=="0": break
else:
print("\n"*2, "输入错误,请重新输入!".center(36))
continue
else:
#从名片库提取要查找姓名的info
#存入dict
card_del = {name:cards_dict[name]}
#调用函数打印即将删除名片
cards_print(card_del)
print("\n"*2, "1. 删除 0. 返回".center(36), "\n"*2)
yes = input("选择:".rjust(16))
if yes=="1":
del cards_dict[name]
print("\n"*2, "名片已成功删除!可以查看试试。".center(36))
print("\n"*2)
print("两秒后返回……".center(36))
time.sleep(2)
break
elif yes=="0": break
else:
print("\n"*3, "选择错误! 重新选择。\n".center(36))
if __name__=="__main__":
card_del()
#其他信息
def info(s,n):
#大字符串打印
def print_s(s, n):
flag = 0
for i in s:
if i=="\n": flag = 0
else: flag += 1
print(i, end="")
if flag==n:
print("\n", end="")
flag = 0
#调用函数打印大字符串
print("\n"*3)
print("﹌"*n,end="\n"*2)
#print_s(s, n)
#弃用打印函数,直接打印,自适应屏幕,还好看点儿😊
print(s)
print("\n", "﹌"*n,end="\n"*2)
input("任意键继续……".center(36))
tool_s = """
【名片管理工具】
1. 新增名片 card_new()
数据存储 cards_save()
2. 显示全部 show_all()
名片打印 cards_print(dict)
3. 查询名片 card_search()
4. 修改名片 card_alter()
5. 名片删除 card_del()
6. 退出系统 sys.exit()
0. 其他信息 info(s, n)
"""
print("\n"*3)
print("﹌"*n,end="\n"*2)
#print_s(tool_s, n)
#弃用打印函数,直接打印,自适应屏幕,还好看点儿😊
print(tool_s)
print("\n", "﹌"*n,end="\n"*2)
print("五秒后继续……".center(36))
#暂停5秒
time.sleep(5)
s = """
本来是教学机构广告我娃娃的,结果,我越看python 越来劲,自己倒是鼓捣上了。孩儿却只学了四节体验课,毕设创意奖,奖品“大黄蜂”乐高积木。目前终于此,不肯继续了,借口太忙,“以后吧!”
梦幻精灵_cq
2021-7-29
"""
print("\n"*3)
print("\n"*2, "﹌"*n,end="\n"*2)
#print_s(s, n)
#弃用打印函数,直接打印,自适应屏幕,还好看点儿😊
print(s)
print("\n", "﹌"*n,end="\n"*2)
print("五秒后返回……".center(36))
#暂停5秒
time.sleep(5)
if __name__=="__main__":
info(" How are you?", 36)