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

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

 

# -*- 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

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值