45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:Python如何实现简单电话本的功能?

Python如何实现简单电话本的功能?

2015-09-02 15:59:51 来源:www.45fan.com 【

Python如何实现简单电话本的功能?

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

本文地址:http://www.45fan.com/a/question/19742.html
Tags: 实现 python 简单
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部