python 被封印的数据类型 200311

本文介绍了Python中如何将非字符串数据类型封印后保存到文件,通过示例展示了保存字典和列表的过程。被封印的数据在文件中失去其原始功能,读取时需使用解封术如eval函数来恢复活性,从而能够再次使用。
摘要由CSDN通过智能技术生成

数据保存到文件 类型的要求

  • 字符串数据类型
  • 非字符串的类型需要封印然后保存
  • 被处理的数据,失去自身的技能

图片为,被南级冰雪封印的病毒和细菌,失去了活性
在这里插入图片描述

  • 演示保存字典
  • 演示保存列表
  • 封印其它数据类型的办法之一
  • 封印保存字典
  • 封印保存列表

从文件中读取数据

  • 存的是什么,取的也是什么
  • 被封印的数据,需要解封才可使用
  • 读取文件,查看类型
  • 解封术,eval函数
  • 体验数据被解封后的功能活性
from segno import helpers

# 功能菜单
func_menu = {
    "1": "新增名片",
    "2": "查询所有名片",
    "3": "搜索名片",
    "4": "批量生成二维码",
    "q": "退出程序"
}

# 搜索结果的处理菜单
deal_menu = {
    "m": "修改名片",
    "d": "删除名片",
    "c": "生成二维码",
}


def load_data():
    """读取文件的内容"""
    # 1,打开文件,读模式
    f = open('card.db', 'r', encoding='utf8')
    # 2,读取内容(读的一定是str类型)
    con = f.read()
    # 3,关闭文件
    f.close()
    # 4,激活被封印的列表
    con_li = eval(con)
    # 5,返回这个列表给调用者
    return con_li


# 所有的数据列表,保存所有的名片信息
card_list = load_data()



# 手动配置一下
dir_path = r'D:\card2020\png\\'


def make_qr(name, email, phone):
    qr = helpers.make_mecard(
        name=name,
        email=email,
        phone=phone
    )
    file_name = name + ".png"  # "张三.png“
    file_path = dir_path + file_name
    # print(file_path)
    qr.save(file_path, scale=5)


def show_welcome():
    """欢迎菜单"""
    print('*'*60)
    print('欢迎使用 宏鹏名片管理系统 V1.0')


def show_menu():
    """显示功能菜单"""
    # 遍历功能菜单字典 同时得到字典的键与值
    for key, val in func_menu.items():
        # print(key,'----',val)
        print('{}----{}'.format(key, val))


def save_data():
    """保存列表的数据到文件中"""
    # 文件打开
    f = open('card.db','w',encoding='utf8')
    # 内容存进去
    con = str(card_list)
    f.write(con)
    # 文件关闭
    f.close()

def add_card():
    """新增名片功能"""
    # 定义了一个用户名片的空字典
    card_dict = {}
    # 接收用户的输入
    name = input('请输入姓名:')
    tel = input('请输入电话:')
    email = input('请输入邮箱:')
    # 空字典中添加内容
    card_dict['name'] = name
    card_dict['tel'] = tel
    card_dict['email'] = email
    # 所有名片的列表添加名片字典
    card_list.append(card_dict)
    # 保存数据到文件中
    save_data()


def show_cards():
    # print('显示所有名片的功能!!!!!!!!!!')
    # 打印表头
    print('姓名\t电话\t\t邮箱\t')
    # print(card_list)  # [{},{}]
    # 遍历全部名片列表,依次获取每一个字典
    for card in card_list:  # card是代表了一个字典
        name = card['name']
        tel = card['tel']
        email = card['email']
        # print(name,tel,email)
        print('{}\t{}\t{}'.format(name, tel, email))


def show_search_result(card):
    print('搜索结果:******************')
    print('姓名\t电话\t\t邮箱\t')
    print('{}\t{}\t{}'.format(card['name'], card['tel'], card['email']))


def show_deal_menu():
    """显示处理的菜单"""
    for key, val in deal_menu.items():
        print("{}----{}".format(key, val))


def deal_choice():
    """用户选择想要的操作"""
    # 接收用户的输入
    choice = input('请选择对该名片的操作:')
    # 验证用户的输入
    if choice not in deal_menu:
        choice = 'error'
    return choice


def get_real_info(input_data, default_data):
    """验证用户输入的内容是否为空,返回有用的数据"""
    strip_data = input_data.strip()  # 把字符串的空格左右两边都去掉
    if len(strip_data) == 0:
        return default_data
    return strip_data


def modify_card(card):
    """
    修改名片,本质就是修改字键中键所对应的值
    :param card:
    :return:
    """
    # - 接收新的数据:姓名,电话,邮箱
    new_name = input('原数据:{},要修改为:'.format(card["name"]))
    new_tel = input('原数据:{},要修改为:'.format(card['tel']))
    new_email = input('原数据:{},要修改为:'.format(card['email']))
    # - 把原字典的对应数据进行修改

    card['name'] = get_real_info(new_name, card["name"])
    card['tel'] = get_real_info(new_tel, card['tel'])
    card['email'] = get_real_info(new_email, card['email'])


def delete_card(card):
    """从名片列表中把字典删除"""
    card_list.remove(card)


def create_png(card):
    print('生成二维码', card)
    make_qr(card["name"], card["email"], card["tel"])


def run_deal_func(choice, card):
    """运行用户的选择"""
    if choice == "error":
        print('不存在的操作指令')
        return
    elif choice == "m":
        modify_card(card)
    elif choice == "d":
        delete_card(card)
    elif choice == "c":
        create_png(card)


def deal_card(card):
    """处理搜索成功的名片"""
    # - 显示功能菜单
    show_deal_menu()
    # - 让用户选择
    choice = deal_choice()
    # - 执行相关的功能函数
    run_deal_func(choice, card)


def search_card():
    """名片搜索"""
    # - 用户要输入一个搜索词
    key = input('请输入要搜索的词(从姓名里查):')  # "张"
    # - 依次遍历出名片列表中的所有字典
    for card in card_list:  # [{"name":???},{}]
        # card 就是一个字典{"name":???}
        # 获取姓名
        name = card["name"]  # ”张三"
        # 如何判断"张" 在不在 "张三" 字符串中?
        if key in name:
            # 显示这个结果
            show_search_result(card)
            # 处理这个结果
            deal_card(card)

            break
        else:
            print('查找不成功,请重新再试')


def user_choice():
    """用户选择"""
    # - 接收用户的输入
    choice = input('请输入您的选择:')
    # - 验证用户的输入是否合法
    # 利用成员运算符进行验证
    if choice not in func_menu:
        print('非法输入,请重新再试。。。。。。。。。。。。')
        choice = "c"  # 数据的校正,把数据修改为我们功能中有的指令

    return choice


def make_all_qr():
    """把所有的名片数据生成二维码图片"""
    for card in card_list:  # card 是代表了字典
        make_qr(card["name"], card["email"], card["tel"])


def run_func(choice_num):
    """根据用户的选择,启动相应的功能"""
    # print('运行{}功能'.format(choice_num))
    print('-'*60)
    if choice_num == "1":  # 新增名片分支
        add_card()

    elif choice_num == "2":  # 显示所有名片的分支
        show_cards()

    elif choice_num == "3":  # 搜索名片的分支
        search_card()

    elif choice_num == "4":  # 批量生成二维码
        make_all_qr()


def start():
    """
    程序的入口
    :return:
    """
    while True:
        # - 1欢迎界面
        show_welcome()
        # - 2功能菜单
        show_menu()
        # - 3用户选择功能
        choice = user_choice()
        if choice == "q":
            break
        if choice == "c":
            continue
        # - 4对应的功能运行
        run_func(choice)
        # 分界符号
        print('\n')


start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值