编写一个简单的控制台通讯录

xiaoxiao2021-02-28  97

分两种实现,一种没有用到类,一种用到了类,后者较为复杂

 

# -*- coding:gbk -*- import os import sys import cPickle as p #判断通讯录是否存在,不在则创建通讯录 if os.path.exists('contacts.dat') == False: f = file('contacts.dat','wb') #以写、二进制的方式读A信息 temp = {'total':0}#创建一个字典,保存所有信息 p.dump(temp,f)#将信息存储到文件 f.close() print "创建通讯录成功!" else: pass #添加联系人 def add(): f = file('contacts.dat','rb') a = p.load(f)#下载信息 f.close() name = raw_input('请输入你要添加的联系人姓名:') if a.has_key(name):#如果已经存在该键 print '该联系人已经存在!添加失败,请更名' else: tel = raw_input('请输入电话号码:') email = raw_input('请输入邮箱:') list = [tel,email] #将每个联系人的信息存到列表中 information = {name:list}#列表存入字典中 a['total'] += 1#联系人总数加一 a.update(information)#将信息添加到元组 f = file('contacts.dat','wb') p.dump(a,f)#存储信息到文件 f.close() print '添加成功' #显示所有联系人 def showall(): f = file('contacts.dat','rb') a = p.load(f) print '一共有{}个联系人.\n'.format(a['total']) print '{:<8}\t{:<15}\t{:<30}'.format('姓名','电话号码','邮箱') for key in a.keys(): if key != 'total': print "{:<8}\t{:<15}\t{:<30}".format(key,a[key][0],a[key][1]) f.close() def exit(): sys.exit() #查找 def search(): f = file('contacts.dat','rb') a = p.load(f) f.close() name = raw_input('请输入需要查找的名字:') if a.has_key(name): print '{}的号码是:{}\t邮箱是{}'.format(name,a[name][0],a[name][1]) else: print '没有该信息!' #修改 def mod(): f = file('contacts.dat','rb') a = p.load(f) f.close() name = raw_input('请输入需要修改的名字:') if a.has_key(name): new_tel = raw_input('请输入新的联系电话:') new_email = raw_input('请输入新的邮箱:') a[name][0] = new_tel a[name][1] = new_email f = file('contacts.dat','wb') p.dump(a,f) f.close() print '修改成功' else: print '该联系人不存在' def delete(): f = file('contacts.dat','rb') a = p.load(f) f.close() name = raw_input('请输入需要删除的名字:') if a.has_key(name): a.pop(name) a['total'] -= 1 f = file('contacts.dat','wb') p.dump(a,f) f.close() print '删除成功' else: print '联系人不存在' #主界面 def menu(): print print "****************************" print " 显示菜单提示信息: *" print " 查找联系人: 1" print " 添加联系人: 2" print " 删除联系人: 3" print " 更改联系人资料: 4" print " 退出通讯录: 5" print "****************************" while True: menu() x=raw_input("请输入您的选择菜单号:") if x == '2': add() showall() continue if x == '5': print "谢谢使用!" exit() continue if x == '1': search() continue if x == '3': delete() showall() continue if x == '4': mod() showall() continue if x == '*': menu() else: print "输入的选项不存在,请重新输入!"

Windows平台下 如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。 如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。 

 

 

# -*- coding:gbk -*- import os import sys import pickle as p import time contacts = {'total' : 0,'':{'phone':'','email':'','type':''}} typelist = ['家人','朋友','同事'] class contact: def __init__(self): if os.path.exists('contacts.dat') == False: f = file('contacts.dat','wb') p.dump(contacts,f) f.close() def show(self): print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format('姓名', '类型', '电话', '邮箱') f = file('contacts.dat','rb') temp = p.load(f) f.close() for key in temp.keys(): if key != 'total': print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key,temp[key]['type'],temp[key]['phone'],temp[key]['email']) #{}格式化输出,左对齐,字符宽度为8 def Add(self): f = file('contacts.dat','rb') temp = p.load(f) f.close() name = raw_input('请输入用户名:') if temp.has_key(name): print '已存在!请更名:' else: type = input('请输入类型:0-家人/1-朋友/2-同事') phone = raw_input('请输入电话:') email = raw_input('请输入邮箱:') info = {'phone':phone,'email':email,'type':typelist[type]} Info = {name:info} save = raw_input('确认存储?y/n') if save.lower() == 'y': temp['total'] += 1 temp.update(Info) f = file('contacts.dat', 'wb') p.dump(temp,f) f.close() print '添加成功' self.show() else: print '存储失败!' def Mod(self): f = file('contacts.dat','rb') temp = p.load(f) name = raw_input('请输入需要修改的名字:') if temp.has_key(name): type = input('请输入新的类型:0-家人/1-朋友/2-同事') phone = raw_input('请输入新的电话:') email = raw_input('请输入新的邮箱:') info = {'phone':phone,'email':email,'type':typelist[type]} mod = raw_input('确认修改?y/n') if mod.lower() == 'y': temp['total'] += 1 temp[name] = info f = file('contacts.dat', 'wb') p.dump(temp,f) f.close() print '修改成功' self.show() else: print '修改失败!' else: print '不存在改名字!请更名' def Del(self): name = raw_input('请输入需要删除的名字:') f = file('contacts.dat','rb') temp = p.load(f) if temp.has_key(name): temp.pop(name) temp['total'] -= 1 f = file('contacts.dat', 'wb') p.dump(temp,f) f.close() print '删除成功' self.show() else: print '没有该名字' def Search(self): t = input('按类型查找-0,按名字查找-1') f = file('contacts.dat','rb') temp = p.load(f) if t == 0: type = input('请输入类型 0-家人/1-朋友/2-同事') for key in temp.keys(): if key != 'total' and temp[key]['type'] == typelist[type]: print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key, temp[key]['type'], \ temp[key]['phone'],temp[key]['email']) elif t == 1: name = raw_input('请输入要查询的姓名:') for key in temp.keys(): if key == name: print "{:<15}\t{:<8}\t{:<15}\t{:<30}\t".format(key, temp[key]['type'], \ temp[key]['phone'], temp[key]['email']) else: print '查询失败!' def Menu(self): print '******************通讯录*********************' print '**** 添加-0 ************' print '**** 修改-1 ************' print '**** 删除-2 ************' print '**** 查询-3 ************' print '**** 退出-4 ************' print '*********************************************' test = contact() print '欢迎查看通讯录!' time.sleep(3) test.show() time.sleep(1) while True: test.Menu() command = int(raw_input('请输入指令:0/1/2/3/4')) if command == 0: test.Add() continue elif command == 1: test.Mod() continue elif command == 2: test.Del() continue elif command == 3: test.Search() continue elif command == 4: print '欢迎使用!' time.sleep(3) sys.exit() else: print '没有该指令' ''' raw_input与input的区别: raw_input:把用户的输入转成字符串 input:不转换,按原类型存储 '''

运行效果:

 

 

C:\Python27\python.exe D:/PyTest_one/test.py 欢迎查看通讯录! 姓名 类型 电话 邮箱 dd 同事 456798 456 jj 朋友 454 44 kl 家人 456 465 ******************通讯录********************* **** 添加-0 ************ **** 修改-1 ************ **** 删除-2 ************ **** 查询-3 ************ **** 退出-4 ************ ********************************************* 请输入指令:0/1/2/3/4

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-57518.html

最新回复(0)