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

##----------------------------------------------------