十 三、python基础:csv版本名片管理系统

# 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()	#调用

猜你喜欢

转载自blog.csdn.net/weixin_42834609/article/details/81347473