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

来源:互联网 发布:linux查看服务器外网ip 编辑:程序博客网 时间:2024/06/06 06:57

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

# -*- coding:gbk -*-import osimport sysimport 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 osimport sysimport pickle as pimport timecontacts = {'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


0 0
原创粉丝点击