# coding:utf-8
#提示给用户的菜单信息
print("="*50) #分割线
print("\t 名片管理系统 v6.0版本") #显示系统版本信息
print("="*50) #分割线
print("请输入序号选择相应操作:") #提示用户可执行的操作
print(" 1 : 添加名片") #选择1,可以添加名片
print(" 2 : 删除名片") #选择2,可以删除名片
print(" 3 : 修改名片") #选择3,可以修改名片
print(" 4 : 查询指定名片") #选择4,可以查询指定名片
print(" 5 : 查询全部名片") #选择5,可以查询全部名片
print(" 6 : 退出系统") #选择6,则退出系统
print("="*50) #分割线
pass_name="666"#账号
pass_word="777"#密码
new_pass_name = input("请输入安全账号:")
new_pass_word = input("请输入安全密码:")
i=0#定义个标志位,用于打破循环
#调试用的列表
"""names = [
{"name": "杨老大", "age": 23, "addr": "公教楼", "tel": "156"},
{"name": "辛老大", "age": 23, "addr": "电气类", "tel": "158"},
{"name": "谢老大", "age": 22, "addr": "公教楼", "tel": "133"},
{"name": "王老大", "age": 23, "addr": "图书馆", "tel": "187"}
]"""
names=[] #定义一个数据库,用来储存名片信息
import csv #导入csv模块
#定义一个储存名片信息的函数
def save_infos():
"""此函数将数据库names的名片信息传给names.csv保存"""
#f = open("card.txt","w")
#str_names = str(names) #将列表转成字符串
#f.write(str_names) #向文件内写入名片信息
#f.close()
#print("新名片已保存")
with open("names.csv","w",newline="",encoding="utf-8") as f: #打开文件
ff=csv.writer(f) #writer设定写入模式
global names #全局变量
for item in names:
ff.writerow(list(item.values())) #writerow写入数据库信息
print("新名片已保存")
#定义一个读取名片信息的函数
def load_infos():
"""此函数用于读取names.csv的用户信息,并将用户信息传给数据库names"""
#f = open("card.txt","r") #打开文件
#content = eval(f.read()) #将读取到的字符串转成列表,并储存到content,,eval的面向对象不能为空
#global names #声明全局变量
#names=content #赋值
#f.close()
try:
with open("names.csv","r",encoding="utf-8") as d:
dd = csv.reader(d)
for item_ in dd:
dict_={"name":item_[0],"age":item_[1],"addr":item_[2],"tel":item_[3]} #字典[键]=值
names.append(dict_)
except Exception as e:
pass
#定义一个添加名片信息的函数
def add_card():
while True: #死循环,当新添名片重名时,确保依旧停留在重新输入新名片信息的界面
print()
print()
print()
print("="*50)
print("\t\t 添加名片") #显示当前进行的操作
print("="*50)
print()
new_name = input("请输入姓名:") #获取新名片的 姓名
print()
#收集到用户输入的信息以后,拼接成想要存储的字典dict数据形式,即此时dict_info这个字典内存放的就是刚刚输入的名片信息
#遍历数据库列表信息,因为列表内存放的都是字典,所以第一次循环时,item就是字典1,第二次循环时,item就是字典2......
for item in names:
if new_name == item["name"]: #item["name"]此时就是:字典名[键],输出的是对应该键的值,第一次for循环就是将new_name和字典1中【name】键 对应的“杨老大”比较
#如果刚刚输入的姓名和names内已有名片的姓名相同 ,则进入该if语句
print()
print("该用户已存在,请重新添加") #提示用户名片已存在,要求重新输入
break
else: #如果刚刚输入的姓名和names内已有名片的姓名不同 ,则进入该else语句
new_age = input("请输入年龄:") #获取新名片的 年龄
print()
new_addr = input("请输入地址:") #获取新名片的 地址
print()
new_tel = input("请输入电话:") #获取新名片的 电话
print()
dict_info = {"name": new_name, "age": new_age, "addr": new_addr, "tel": new_tel}
names.append(dict_info) #将刚刚输入的名片信息存到names中
save_infos() #更新数据库
print()
print("添加新名片[%s]成功!\n\n该名片信息为:%s"%(new_name,dict_info) ) #提示用户添加完成
break #添加完成,跳到操作菜单
#定义一个删除名片信息的函数
def del_card():
print()
print()
print()
print("="*50)
print("\t\t 删除名片") #显示当前进行的操作
print("="*50)
print()
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
else: #for in else 语句使用时,只要不在for in语句内加上break语句打断循环,最后都会执行else语句
print()
print("以上为全部名片信息")
print()
del_name=input("请选择您要删除的名片:") #获取用户想要删除的名片信息
print()
sure_or_no = input("确定删除[%s]吗\t y/n"%(del_name)) #再次确认是否要删除
for item in names: #遍历
if (del_name == item["name"]) and (sure_or_no == "y"): #判断想要删除的名片是否存在,且用户是否决定删除
names.remove(item) #存在则删除
save_infos() #更新数据库
print()
print("名片[%s]已成功删除!"%del_name) #提示用户删除成功
break #跳出
else:
print()
print("删除失败,请重新尝试")#输入信息有误或名片并不存在,提示用户删除失败
#定义一个修改名片信息的函数
def mod_card():
print()
print()
print()
print("="*50)
print("\t\t 修改名片") #显示当前进行的操作
print("="*50)
print()
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
mod_name=input("请选择您要修改的名片:") #获取想要修改的名片的信息
for item in names: #for循环遍历names
if mod_name == item["name"]:#判断是否存在该名片,存在则执行下面的if语句
break
else:
print()
print("您输入的信息有误!请重新尝试")#输入信息有误或名片并不存在,提示用户修改失败
if mod_name == item["name"]:
after_mod_name = input("请输入该名片的新名字: ") #获取修改后名片的新名字
for items in names: #for循环遍历names
if after_mod_name == items["name"]:#判断是否重名,重名则退出
print()
print("该用户已存在,请重新输入")
break
else: #若不重名则修改新名片
after_mod_age = input("请输入该名片的新年龄: ") #获取修改后名片的新年龄
after_mod_addr = input("请输入该名片的新地址: ") #获取修改后名片的新地址
after_mod_tel = input("请输入该名片的新电话: ") #获取修改后名片的新电话
#item此时为想要修改的那个名字所对应的元素(字典),比如想要修改辛老大,那么此时item就是{"name": "辛老大", "age": 23, "addr": "科大电气类", "tel": "158"}
#names.index(item)获取这个元素(字典)在nams列表内的下标
#names[下标]获取列表内的某一个元素(字典)
#字典名[已存在的键]=new_value 修改已存在的键值对
names[names.index(item)]["name"]=after_mod_name #修改名片信息
names[names.index(item)]["age"]=after_mod_age #修改名片信息
names[names.index(item)]["addr"]=after_mod_addr #修改名片信息
names[names.index(item)]["tel"]=after_mod_tel #修改名片信息
save_infos() #更新数据库
print()
print()
print("名片修改成功,\n\n该名片的新信息为:姓名:%s 年龄:%s 地址:%s 电话:%s "%(after_mod_name,after_mod_age,after_mod_addr,after_mod_tel))
#提示用户名片已修改成功,并显示出修改后名片的信息
#定义一个查询指定名片信息的函数
def cat_a_card():
print()
print()
print()
print("="*50)
print("\t\t 查询指定名片") #显示当前进行的操作
print("="*50)
print()
name = input("请输入要查询的名片名字:")
for item in names:
if name == item["name"]: #打印名片信息
print()
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
break
else:
print()
print()
print("查无此人!")
#定义一个查询全部名片信息的函数
def cat_all_card():
print()
print()
print()
print("="*50)
print("\t\t 查询所有名片") #显示当前进行的操作
print("="*50)
print()
num=len(names)
for item in names: #打印出所有名片
print("\n姓名: %s 年龄: %s 地址: %s 电话: %s"%(item["name"],item["age"],item["addr"],item["tel"]))
print()
else:
print()
print("共%s张名片"%num) #显示名片数
#主函数
def main():
load_infos()#读取数据信息
global i #声明全局变量
if (new_pass_name==pass_name)and(new_pass_word==pass_word)and (i==0): #判断账号密码正确性
while True:
print() #空格
print() #空格
num = int(input("请选择您要进行的操作:")) #将收集到的信息转为int型 # 异常处理 try except
# 根据用户所选择的菜单信息执行相应的功能
if num == 1:
add_card()#添加名片
elif num == 2:
del_card()#删除名片
elif num == 3:
mod_card()#修改名片
elif num == 4:
cat_a_card()#查询指定名片
elif num == 5:
cat_all_card()#查询所有名片
elif num == 6:
i+=1 # 退出系统
break
else:
print()
print("您输入的信息有误,请重新输入!")
else:
print()
print("账号密码错误,退出系统")
main() #调用
十 三、python基础:csv版本名片管理系统
猜你喜欢
转载自blog.csdn.net/weixin_42834609/article/details/81347473
今日推荐
周排行