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