Python 实现简单的电话本功能
admin
2023-07-31 02:36:06
0

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

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...