myPhoneBook2.py
#!/usr/bin/python # -*- coding: utf-8 -*- import re class PhoneBook(object): \'\'\'这是一个电话簿脚本。 该脚本能够实现 AddContact:添加联系人信息 ShowContact:查找姓名显示联系人 SaveContacts:存储联系人到 TXT 文档(存储格式——姓名:号码/号码) LoadContacts:从 txt 文档中载入联系人 \'\'\' def __init__(self): self.contactsDict = {} def AddContact(self): while True: name = raw_input(\'请输入姓名>>>\') name = name.strip() # 姓名必须包含有效字符 if name != \'\': break print \'***姓名不能为空\' while True: number = raw_input(\'请输入号码>>>\') number = re.sub(r\'\\D\', \'\', number) # 删除号码中的非数字字符 if number != \'\': break print \'***号码只能是数字\' cover = True #若联系人已存在,是否覆盖 if self.contactsDict.has_key(name): print \'***联系人已存在\' self.ShowContact(name) while True: control = raw_input(\'\'\' 输入 \"c\":覆盖原来号码 输入 \"n\":保留原来号码并存储新号码 输入 \"q\" 退出\\n>>>\'\'\') if control.lower() == \'n\': cover = False break if control.lower() == \'c\': break if control.lower() == \'q\': return None print \'***输入错误\' if cover: self.contactsDict[name] = number else: if number in self.contactsDict[name]: print \'***号码已经存在\' else: self.contactsDict[name] = self.contactsDict[name] + \'/\' + number def ShowContact(self, name): print \'++++++++++++++++++++++++\' if self.contactsDict.has_key(name): print \'【联系人信息】\' print \'【姓名: %s】\' % name numberList = self.contactsDict[name].split(\'/\') for num in range(len(numberList)): print \'【号码%d: %s】\' % (num+1, numberList[num]) else: print \'【找不到联系人%s】\' % name print \'++++++++++++++++++++++++\' def DeleteNumber(self, name): if self.contactsDict.has_key(name): self.ShowContact(name) number = self.contactsDict[name].split(\'/\') while True: print \'\'\' 请输入要删除号码的序号 或者输入 \"a\" 删除该联系人 或者输入 \"q\" 退出(不删除) (若联系人号码被全部删除,该联系人也将被删除)\'\'\' control = raw_input(\'>>>\') if control.lower() == \'q\': break elif control.lower() == \'a\': del self.contactsDict[name] break elif control.isdigit() and int(control) <= len(number): del number[int(control)-1] self.contactsDict[name] = \'/\'.join(number) break else: print \'***输入有误\' def LoadContacts(self): \'\'\' try: PhoneBook = open(\'PhoneBook.txt\', \'a+\') contacts = PhoneBook.read() if contacts == \'\': print \'***电话簿为空\' else: ContactsList = contacts.split(\'\\n\') for contact in ContactsList: if not contact == \'\': contact = contact.split(\':\') name = contact[0] number = contact[1] self.contactsDict[name] = number finally: PhoneBook.close() \'\'\' self.contactsDict = {line.split(\':\')[0]: line.split(\':\')[1] for line in open(\'PhoneBook.txt\',\'a+\').readlines()} def SaveContacts(self): try: if self.contactsDict: PhoneBook = open(\'PhoneBook.txt\', \'w\') for name, number in self.contactsDict.items(): line = name + \':\' + number PhoneBook.write(line) PhoneBook.write(\'\\n\') else: print \'***没有联系人信息\' finally: PhoneBook.close() if __name__ == \'__main__\': myPhoneBook = PhoneBook() myPhoneBook.LoadContacts() try: while True: raw_input(\'按回车键继续\') print \'\'\' -------------------------------- 输入 a:添加联系人 输入 s:显示联系人信息 输入 d:删除联系人 输入 q:退出 --------------------------------\'\'\' control = raw_input(\'>>>\') if control.lower() == \'a\': myPhoneBook.AddContact() elif control.lower() == \'s\': name = raw_input(\'请输入要查找的联系人姓名\\n>>>\') myPhoneBook.ShowContact(name) elif control.lower() == \'d\': name = raw_input(\'请输入要删除的联系人姓名\\n>>>\') myPhoneBook.DeleteNumber(name) elif control.lower() == \'q\': break else: print \'***输入有误\' finally: myPhoneBook.SaveContacts()
花了一个下午和半个晚上写了这个简单通讯录:
哈哈,第一次写这么长的Python代码,自认为结构还是挺合理的。
代码如下:
#-*- coding:utf-8 -*- # file :addrList.py # date :2011-10-24 15:40:13 # 设计一个基本的通讯录管理程序,使其具有添加,删除,编辑,查找等功能。 # 要求使用C/C++,java,javascript,python中任意一种语言实现。字符界面即可。 # 不需要有GUI(图形界面) import sys import os import string import re from datetime import datetime QUIT_FLAG = False ADDRS_LIST = \"addr_list.txt\" _addrs_dict = {} _addrs_count = 0 DEBUG=2 def info(message): global DEBUG if DEBUG > 0: print message def debug(message): global DEBUG if DEBUG > 1: print message def warn(message): global DEBUG if DEBUG > 0: print message def error(message): print message def help(): print \"用法:输入菜单中的命令即可执行相应操作!\" print \"可用菜单命令如下:\" showMenu() def showMenu(): print \"+******************操作菜单***********************+\" print \"|查看所有联系人(all) | 查找联系人(find) |\" print \"|添加联系人(add) | 删除联系人(remove) |\" print \"|编辑联系人(edit) | 保存并退出(save) |\" print \"|使用帮助(help) | 退出但不保存(quit) |\" print \"+_________________________________________________+\" def showError(info): print info def 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 = False print \"姓名太长了!\" if not _rPhone.match(items[1]): _flag = False print \"手机号码格式不正确\" if not _rQQ.match(items[2]): _flag = False print \"QQ号码输入有误\" return _flag def buildAddr(addr): _addr={} items=addr.split() if len(items) < 3: print \"您输入的信息太少了\" return None if not verifyInput(items): return None _addr[\'name\']=items[0] _addr[\'phone\'] = items[1] _addr[\'QQ\'] = items[2] return _addr def addAddr(addr): global _addrs_count,_addrs_dict _addrs_count+=1 _addr=buildAddr(addr) if not _addr: return None _addrs_dict[_addrs_count]=_addr def init(): if not os.path.isfile(ADDRS_LIST): return None faddr=open(ADDRS_LIST,\"r\") for line in faddr: if len(line) == 0: continue addAddr(line) faddr.close() def save(): global _addrs_dict faddr=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_dict if len(_addrs_dict) < 1: print \"联系人当中暂无记录!\" return None printHead() for key,addr in _addrs_dict.items(): printAddr(key,addr) def doFind(): _flag=False flag1=flag2=flag3=False cond=raw_input(\"请输入查询信息:>\") debug(\"DEBUG:{0}\".format(cond)) if len(cond) == 0: return None if 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 None addAddr(line) def existsId(_id): global _addrs_dict return _addrs_dict.has_key(_id) # if _id > _addrs_count or _id < 1: # return False # else: # return True def doRemove(): FLAG = True while FLAG: key=raw_input(\"请输入要删除的联系人的编号(取消请输入#)\") if key == \'#\': FLAG = False continue if not existsId(int(key,10)): print \"不存在您所输入编号的联系人。请确认\" continue print \"编号为 {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 = False def doEdit(): FLAG = True while FLAG: key=raw_input(\"请输入要编辑的联系人的编号(取消请输入#)\") print \"DEBUG:key:{0}\".format(key) if key == \'#\': FLAG = False continue if not existsId(int(key,10)): print \"不存在您所输入编号的联系人。请确认\" continue print \"编号为 {0} 的联系人信息如下:\".format(key) printById(int(key,10)) updateById(int(key,10)) FLAG = False def doSave(): save() doQuit() def doQuit(): global QUIT_FLAG QUIT_FLAG = True print \"正在退出……\" # 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_dict printHead() 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\']=name phone=raw_input(\"请输入新手机号码:>\") if len(phone) > 0: _addr[\'phone\']=phone qq=raw_input(\"请输入新的QQ号码:>\") if len(qq) > 0 : _addr[\'QQ\']=qq _addrs_dict[_id]=_addr print \"更新成功!\" print \"联系人新的信息如下:\" printById(_id) def findById(_id): if existsId(_id): printById(_id) return True else: return False def findByField(cond,field=\'name\'): global _addrs_dict _flag = False for key,addr in _addrs_dict.items(): if addr[field].find(cond) != -1: printAddr(key,addr) _flag=True return _flag def 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 ##----------------------------------------------------