名片管理系统(dict 字典 and def 自定义函数练习)

【名片管理系统】

  (作业小练习)

☆程序调试环境☆
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)

代码文件和名片数据存储文件

在这里插入图片描述


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值