数据保存到文件 类型的要求
- 字符串数据类型
- 非字符串的类型需要封印然后保存
- 被处理的数据,失去自身的技能
图片为,被南级冰雪封印的病毒和细菌,失去了活性
- 演示保存字典
- 演示保存列表
- 封印其它数据类型的办法之一
- 封印保存字典
- 封印保存列表
从文件中读取数据
- 存的是什么,取的也是什么
- 被封印的数据,需要解封才可使用
- 读取文件,查看类型
- 解封术,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()