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
##----------------------------------------------------
(0)

相关推荐

  • Python编写电话薄实现增删改查功能

    初学python,写一个小程序练习一下.主要功能就是增删改查的一些功能.主要用到的技术:字典的使用,pickle的使用,io文件操作.代码如下: import pickle #studentinfo = {'netboy': '15011038018',\ # 'godboy': '15011235698'} studentinfo = {} FUNC_NUM = 5 def write_file(value): file = open('student_info.txt', 'wb') fil

  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

  • Python实现命令行通讯录实例教程

    1.实现目标 编写一个命令行通讯录程序,可以添加.查询.删除通讯录好友及电话 2.实现方法 创建一个类来表示一个人的信息.使用字典存储每个人的对象,名字作为键. 使用pickle模块永久地把这些对象存储下来. 使用字典内建的方法添加.删除修改人员信息. 3.思维导图 4.编写伪代码 # 1.创建字典用来存储通讯录信息 # 2.创建人员类,包含姓名.关系.电话三个属性 # 3.创建操作类,包含增加.查询.删除人员,退出,保存并退出五个方法 # 4.程序运行 # 5.判断通讯录文件是否存在 # 6.

  • python实现读取命令行参数的方法

    本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sys 参数个数:len(sys.argv) 脚本名:    sys.argv[0] 参数1:     sys.argv[1] 参数2:     sys.argv[2] test.py: import sys print "脚本名:", sys.argv[0] for i in rang

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

  • 30分钟学会用PHP写带数据库的简单通讯录第1/3页

    引用上篇文章的开场白: 我接触PHP也不是很久,所以有什么不足的地方,欢迎各位指正,让大家见笑了. 这篇小教程的对象是PHP初学者,都是些最简单.最基本的东西,因此高手们可以略过哦. 为了让各位初学者提起兴趣.尽快入门,这里写的是将是最简单,最基本的PHP程序,相信你只要有一点点的PHP基础知识,10分钟之内就能把它学会.没有PHP基础知识也没有关系,只要耐心的看,学会它也不会超过一个小时的. 我写这篇文章的目的是,和大家一起共同学习.共同进步,然后将PHP初学者们对PHP的恐惧心理驱赶到十万八

  • python获取从命令行输入数字的方法

    本文实例讲述了python获取从命令行输入数字的方法.分享给大家供大家参考.具体如下: #---------------------------------------- # Name: numerical_input.py # Author: Kevin Harris # Last Modified: 02/13/04 # Description: This Python script demonstrates # how to get numerical input # from the c

  • 一个简单的python程序实例(通讯录)

    核心代码: 复制代码 代码如下: #!/usr/bin/python#Filename:friendbook.pyimport cPickle as pimport sysimport timeimport os ab={'Xdex':'cneds@fnedf.com',        'Laexly':'fev@fe.com',        'Fukc':'fexok@ver.com',        'Stifu':'stif@qq.com'} def Dumpfile(list):   

  • python 获取命令行参数 函数

    import sys print sys.argv print len(sys.argv) #参数个数 print sys.argv[1] #第一个参数 print sys.argv[2]

  • python实现定制交互式命令行的方法

    Python的交互式命令行可通过启动文件来配置. 当Python启动时,会查找环境变量PYTHONSTARTUP,并且执行该变量中所指定文件里的程序代码.该指定文件名称以及地址可以是随意的.按Tab键时会自动补全内容和命令历史.这对命令行的有效增强,而这些工具则是基于readline模块实现的(这需要readline程序库辅助实现). 此处为大家举一个简单的启动脚本文件例子,它为python命令行添加了按键自动补全内容和历史命令功能. [python@python ~]$ cat .python

随机推荐