Python 实现简单的电话本功能
myPhoneBook2.py
#!/usr/bin/python #-*-coding:utf-8-*- importre classPhoneBook(object): '''这是一个电话簿脚本。 该脚本能够实现 AddContact:添加联系人信息 ShowContact:查找姓名显示联系人 SaveContacts:存储联系人到TXT文档(存储格式——姓名:号码/号码) LoadContacts:从txt文档中载入联系人 ''' def__init__(self): self.contactsDict={} defAddContact(self): whileTrue: name=raw_input('请输入姓名>>>') name=name.strip() #姓名必须包含有效字符 ifname!='': break print'***姓名不能为空' whileTrue: number=raw_input('请输入号码>>>') number=re.sub(r'\D','',number) #删除号码中的非数字字符 ifnumber!='': break print'***号码只能是数字' cover=True#若联系人已存在,是否覆盖 ifself.contactsDict.has_key(name): print'***联系人已存在' self.ShowContact(name) whileTrue: control=raw_input(''' 输入"c":覆盖原来号码 输入"n":保留原来号码并存储新号码 输入"q"退出\n>>>''') ifcontrol.lower()=='n': cover=False break ifcontrol.lower()=='c': break ifcontrol.lower()=='q': returnNone print'***输入错误' ifcover: self.contactsDict[name]=number else: ifnumberinself.contactsDict[name]: print'***号码已经存在' else: self.contactsDict[name]=self.contactsDict[name]+'/'+number defShowContact(self,name): print'++++++++++++++++++++++++' ifself.contactsDict.has_key(name): print'【联系人信息】' print'【姓名:%s】'%name numberList=self.contactsDict[name].split('/') fornuminrange(len(numberList)): print'【号码%d:%s】'%(num+1,numberList[num]) else: print'【找不到联系人%s】'%name print'++++++++++++++++++++++++' defDeleteNumber(self,name): ifself.contactsDict.has_key(name): self.ShowContact(name) number=self.contactsDict[name].split('/') whileTrue: print''' 请输入要删除号码的序号 或者输入"a"删除该联系人 或者输入"q"退出(不删除) (若联系人号码被全部删除,该联系人也将被删除)''' control=raw_input('>>>') ifcontrol.lower()=='q': break elifcontrol.lower()=='a': delself.contactsDict[name] break elifcontrol.isdigit()andint(control)<=len(number): delnumber[int(control)-1] self.contactsDict[name]='/'.join(number) break else: print'***输入有误' defLoadContacts(self): ''' try: PhoneBook=open('PhoneBook.txt','a+') contacts=PhoneBook.read() ifcontacts=='': print'***电话簿为空' else: ContactsList=contacts.split('\n') forcontactinContactsList: ifnotcontact=='': contact=contact.split(':') name=contact[0] number=contact[1] self.contactsDict[name]=number finally: PhoneBook.close() ''' self.contactsDict={line.split(':')[0]:line.split(':')[1]forlineinopen('PhoneBook.txt','a+').readlines()} defSaveContacts(self): try: ifself.contactsDict: PhoneBook=open('PhoneBook.txt','w') forname,numberinself.contactsDict.items(): line=name+':'+number PhoneBook.write(line) PhoneBook.write('\n') else: print'***没有联系人信息' finally: PhoneBook.close() if__name__=='__main__': myPhoneBook=PhoneBook() myPhoneBook.LoadContacts() try: whileTrue: raw_input('按回车键继续') print''' -------------------------------- 输入a:添加联系人 输入s:显示联系人信息 输入d:删除联系人 输入q:退出 --------------------------------''' control=raw_input('>>>') ifcontrol.lower()=='a': myPhoneBook.AddContact() elifcontrol.lower()=='s': name=raw_input('请输入要查找的联系人姓名\n>>>') myPhoneBook.ShowContact(name) elifcontrol.lower()=='d': name=raw_input('请输入要删除的联系人姓名\n>>>') myPhoneBook.DeleteNumber(name) elifcontrol.lower()=='q': break else: print'***输入有误' finally: myPhoneBook.SaveContacts()
花了一个下午和半个晚上写了这个简单通讯录:
哈哈,第一次写这么长的Python代码,自认为结构还是挺合理的。
代码如下:
#-*-coding:utf-8-*- #file:addrList.py #date:2011-10-2415:40:13 #设计一个基本的通讯录管理程序,使其具有添加,删除,编辑,查找等功能。 #要求使用C/C++,java,javascript,python中任意一种语言实现。字符界面即可。 #不需要有GUI(图形界面) importsys importos importstring importre fromdatetimeimportdatetime QUIT_FLAG=False ADDRS_LIST="addr_list.txt" _addrs_dict={} _addrs_count=0 DEBUG=2 definfo(message): globalDEBUG ifDEBUG>0: printmessage defdebug(message): globalDEBUG ifDEBUG>1: printmessage defwarn(message): globalDEBUG ifDEBUG>0: printmessage deferror(message): printmessage defhelp(): print"用法:输入菜单中的命令即可执行相应操作!" print"可用菜单命令如下:" showMenu() defshowMenu(): print"+******************操作菜单***********************+" print"|查看所有联系人(all)|查找联系人(find)|" print"|添加联系人(add)|删除联系人(remove)|" print"|编辑联系人(edit)|保存并退出(save)|" print"|使用帮助(help)|退出但不保存(quit)|" print"+_________________________________________________+" defshowError(info): printinfo defdoSwitch(op): ifop=="all": doAll() elifop=="find": doFind() elifop=="add": doAdd() elifop=="remove": doRemove() elifop=="edit": doEdit() elifop=="save": doSave() elifop=="help": help() elifop=="quit": doQuit() else: showError("错误:您输入的命令有误,请重新输入。需要帮助请输入help!") defverifyInput(items): _flag=True _rPhone=re.compile(r'1[0-9]{10}') _rQQ=re.compile(r'[1-9][0-9]{4,9}') iflen(items[0])>10: _flag=False print"姓名太长了!" ifnot_rPhone.match(items[1]): _flag=False print"手机号码格式不正确" ifnot_rQQ.match(items[2]): _flag=False print"QQ号码输入有误" return_flag defbuildAddr(addr): _addr={} items=addr.split() iflen(items)<3: print"您输入的信息太少了" returnNone ifnotverifyInput(items): returnNone _addr['name']=items[0] _addr['phone']=items[1] _addr['QQ']=items[2] return_addr defaddAddr(addr): global_addrs_count,_addrs_dict _addrs_count+=1 _addr=buildAddr(addr) ifnot_addr: returnNone _addrs_dict[_addrs_count]=_addr definit(): ifnotos.path.isfile(ADDRS_LIST): returnNone faddr=open(ADDRS_LIST,"r") forlineinfaddr: iflen(line)==0: continue addAddr(line) faddr.close() defsave(): global_addrs_dict faddr=open(ADDRS_LIST,"w+") foraddrin_addrs_dict.values(): faddr.write("{0}\t{1}\t{2}\n".format(addr['name'],addr['phone'],addr['QQ'])) faddr.flush() faddr.close() defdoAll(): global_addrs_dict iflen(_addrs_dict)<1: print"联系人当中暂无记录!" returnNone printHead() forkey,addrin_addrs_dict.items(): printAddr(key,addr) defdoFind(): _flag=False flag1=flag2=flag3=False cond=raw_input("请输入查询信息:>") debug("DEBUG:{0}".format(cond)) iflen(cond)==0: returnNone ifcond.isdigit(): flag1=findById(int(cond,10)) flag2=findByPhone(cond) flag3=findByQQ(cond) else: flag1=findByName(cond) _flag=flag1orflag2orflag3 ifnot_flag: print"没有查找到任何联系人!" defdoAdd(): line=raw_input("请依次输入联系人的姓名,手机号码,QQ号码>") iflen(line)==0: returnNone addAddr(line) defexistsId(_id): global_addrs_dict return_addrs_dict.has_key(_id) #if_id>_addrs_countor_id<1: #returnFalse #else: #returnTrue defdoRemove(): FLAG=True whileFLAG: key=raw_input("请输入要删除的联系人的编号(取消请输入#)") ifkey=='#': FLAG=False continue ifnotexistsId(int(key,10)): print"不存在您所输入编号的联系人。请确认" continue print"编号为{0}的联系人信息如下:".format(key) printById(int(key,10)) yesOrNo=raw_input("您确定要删除上述联系人吗?(y/n)") ifyesOrNoin"yY": removeById(int(key,10)) print"删除成功!" yesOrNo=raw_input("您还需要继续删除联系人吗?(y/n)") ifnotyesOrNoin"yY": FLAG=False defdoEdit(): FLAG=True whileFLAG: key=raw_input("请输入要编辑的联系人的编号(取消请输入#)") print"DEBUG:key:{0}".format(key) ifkey=='#': FLAG=False continue ifnotexistsId(int(key,10)): print"不存在您所输入编号的联系人。请确认" continue print"编号为{0}的联系人信息如下:".format(key) printById(int(key,10)) updateById(int(key,10)) FLAG=False defdoSave(): save() doQuit() defdoQuit(): globalQUIT_FLAG QUIT_FLAG=True print"正在退出……" #exit(0) defprintHead(): print"+-----+----------+---------------+---------------+" print"|编号|姓名|手机号码|QQ号码|" print"+-----+----------+---------------+---------------+" defprintAddr(key,addr): #print"+-----+----------+---------------+---------------+" print"|{0:^5}|{1:^10}|{2:^15}|{3:^15}|".format(key,addr['name'],addr['phone'],addr['QQ']) print"+-----+----------+---------------+---------------+" defprintById(_id): global_addrs_dict printHead() printAddr(_id,_addrs_dict[_id]) defremoveById(_id): global_addrs_dict _addrs_dict.pop(_id) defupdateById(_id): global_addrs_dict _addr=_addrs_dict.get(_id) print"请输入该联系人的新信息,相应留空则保留原有信息" name=raw_input("请输入新姓名:>") iflen(name)>0: _addr['name']=name phone=raw_input("请输入新手机号码:>") iflen(phone)>0: _addr['phone']=phone qq=raw_input("请输入新的QQ号码:>") iflen(qq)>0: _addr['QQ']=qq _addrs_dict[_id]=_addr print"更新成功!" print"联系人新的信息如下:" printById(_id) deffindById(_id): ifexistsId(_id): printById(_id) returnTrue else: returnFalse deffindByField(cond,field='name'): global_addrs_dict _flag=False forkey,addrin_addrs_dict.items(): ifaddr[field].find(cond)!=-1: printAddr(key,addr) _flag=True return_flag deffindByName(name): returnfindByField(name,'name') deffindByPhone(phone): returnfindByField(phone,'phone') deffindByQQ(qq): returnfindByField(qq,'QQ') defmain(): init() showMenu() while(notQUIT_FLAG): operation=raw_input("请在此处输入菜单命令>") doSwitch(operation) if__name__=='__main__': main() ##dosomething ##----------------------------------------------------