用Python实现的简单通讯录
花了一个下午和半个晚上写了这个简单通讯录:
哈哈,第一次写这么长的Python代码,自认为结构还是挺合理的。
代码如下:
#-*- coding:utf-8 -*-# file :addrList.py# date :2011-10-24 15:40:13# 设计一个基本的通讯录管理程序,使其具有添加,删除,编辑,查找等功能。# 要求使用C/C++,java,javascript,python中任意一种语言实现。字符界面即可。# 不需要有GUI(图形界面)import sysimport osimport stringimport refrom datetime import datetimeQUIT_FLAG = FalseADDRS_LIST = "addr_list.txt"_addrs_dict = {} _addrs_count = 0DEBUG=2def info(message):global DEBUGif DEBUG > 0:print messagedef debug(message):global DEBUGif DEBUG > 1:print messagedef warn(message):global DEBUGif DEBUG > 0:print messagedef error(message):print messagedef help():print "用法:输入菜单中的命令即可执行相应操作!"print "可用菜单命令如下:"showMenu()def showMenu():print "+******************操作菜单***********************+"print "|查看所有联系人(all) | 查找联系人(find) |"print "|添加联系人(add) | 删除联系人(remove) |"print "|编辑联系人(edit) | 保存并退出(save) |"print "|使用帮助(help) | 退出但不保存(quit) |"print "+_________________________________________________+"def showError(info):print infodef doSwitch(op):if op == "all":doAll()elif op == "find":doFind()elif op == "add":doAdd()elif op == "remove":doRemove()elif op == "edit":doEdit()elif op == "save":doSave()elif op == "help":help()elif op == "quit":doQuit()else:showError("错误:您输入的命令有误,请重新输入。需要帮助请输入help!")def verifyInput(items):_flag = True_rPhone = re.compile(r'1[0-9]{10}')_rQQ = re.compile(r'[1-9][0-9]{4,9}')if len(items[0]) > 10:_flag = Falseprint "姓名太长了!"if not _rPhone.match(items[1]):_flag = Falseprint "手机号码格式不正确"if not _rQQ.match(items[2]):_flag = Falseprint "QQ号码输入有误"return _flagdef buildAddr(addr):_addr={}items=addr.split()if len(items) < 3:print "您输入的信息太少了"return Noneif notverifyInput(items):return None_addr['name']=items[0]_addr['phone'] = items[1]_addr['QQ'] = items[2]return _addrdef addAddr(addr):global _addrs_count,_addrs_dict_addrs_count+=1_addr=buildAddr(addr)if not _addr:return None_addrs_dict[_addrs_count]=_addrdef init():if not os.path.isfile(ADDRS_LIST):return Nonefaddr=open(ADDRS_LIST,"r")for line in faddr:if len(line) == 0:continueaddAddr(line)faddr.close()def save():global _addrs_dictfaddr=open(ADDRS_LIST,"w+")for addr in _addrs_dict.values():faddr.write("{0}\t{1}\t{2}\n".format(addr['name'],addr['phone'],addr['QQ']))faddr.flush()faddr.close()def doAll():global _addrs_dictif len(_addrs_dict) < 1:print "联系人当中暂无记录!"return NoneprintHead()for key,addr in _addrs_dict.items():printAddr(key,addr)def doFind():_flag=Falseflag1=flag2=flag3=Falsecond=raw_input("请输入查询信息:>")debug("DEBUG:{0}".format(cond))if len(cond) == 0:return Noneif cond.isdigit():flag1=findById(int(cond,10))flag2=findByPhone(cond)flag3=findByQQ(cond)else:flag1=findByName(cond)_flag = flag1 or flag2 or flag3 if not _flag:print "没有查找到任何联系人!"def doAdd():line = raw_input("请依次输入联系人的姓名,手机号码,QQ号码>")if len(line) == 0:return NoneaddAddr(line)def existsId(_id):global _addrs_dictreturn _addrs_dict.has_key(_id)#if _id > _addrs_count or _id < 1:#return False #else:#return Truedef doRemove():FLAG = Truewhile FLAG:key=raw_input("请输入要删除的联系人的编号(取消请输入#)")if key == '#':FLAG = Falsecontinueif not existsId(int(key,10)):print "不存在您所输入编号的联系人。请确认"continueprint "编号为 {0} 的联系人信息如下:".format(key)printById(int(key,10))yesOrNo=raw_input("您确定要删除上述联系人吗?(y/n)")if yesOrNo in "yY":removeById(int(key,10))print "删除成功!"yesOrNo=raw_input("您还需要继续删除联系人吗?(y/n)")if not yesOrNo in "yY":FLAG = Falsedef doEdit():FLAG = Truewhile FLAG:key=raw_input("请输入要编辑的联系人的编号(取消请输入#)")print "DEBUG:key:{0}".format(key)if key == '#':FLAG = Falsecontinueif not existsId(int(key,10)):print "不存在您所输入编号的联系人。请确认"continueprint "编号为 {0} 的联系人信息如下:".format(key)printById(int(key,10))updateById(int(key,10))FLAG = Falsedef doSave():save()doQuit()def doQuit():global QUIT_FLAGQUIT_FLAG = Trueprint "正在退出……"#exit(0)def printHead():print "+-----+----------+---------------+---------------+"print "|编号 | 姓名 | 手机号码 | QQ号码 |"print "+-----+----------+---------------+---------------+"def printAddr(key,addr):#print "+-----+----------+---------------+---------------+"print "|{0:^5}|{1:^10}|{2:^15}|{3:^15}|".format(key,addr['name'],addr['phone'],addr['QQ'])print "+-----+----------+---------------+---------------+"def printById(_id):global _addrs_dictprintHead()printAddr(_id,_addrs_dict[_id])def removeById(_id):global _addrs_dict_addrs_dict.pop(_id)def updateById(_id):global _addrs_dict_addr= _addrs_dict.get(_id)print "请输入该联系人的新信息,相应留空则保留原有信息"name=raw_input("请输入新姓名:>")if len(name) > 0:_addr['name']=namephone=raw_input("请输入新手机号码:>")if len(phone) > 0:_addr['phone']=phoneqq=raw_input("请输入新的QQ号码:>")if len(qq) > 0 :_addr['QQ']=qq_addrs_dict[_id]=_addrprint "更新成功!"print "联系人新的信息如下:"printById(_id)def findById(_id):if existsId(_id):printById(_id)return Trueelse:return Falsedef findByField(cond,field='name'):global _addrs_dict_flag = Falsefor key,addr in _addrs_dict.items():if addr[field].find(cond) != -1:printAddr(key,addr)_flag=Truereturn _flagdef findByName(name):return findByField(name,'name')def findByPhone(phone):return findByField(phone,'phone')def findByQQ(qq):return findByField(qq,'QQ')def main():init()showMenu()while(not QUIT_FLAG):operation=raw_input("请在此处输入菜单命令>")doSwitch(operation)if __name__=='__main__':main()## do something##----------------------------------------------------