题目:
一个文本通讯录要求:
#!/usr/bin/env python #!encoding:utf-8 #filename:contacts_list.py #QUESTION FROM:http://uliweb.clkg.org/tutorial/view_chapter/183 import pickle, pprint import os, sys def create_contact(file_path): #初始化通讯录文本 exist = os.path.isfile(file_path) if exist: os.remove(file_path)#如果已经存在则删除通讯录,下一步重新建立 print "remove old conntact list successfully ! " init_contact = { 'lijyt':{'cellphone':'13990000343','tel':'0512-86565544','qq':'45453242','e-mail':'[email protected]'}, 'zhanw':{'cellphone':'15992222343','tel':'0523-89565544','qq':'89545445','e-mail':'[email protected]'}, 'dongf':{'cellphone':'18905555343','tel':'0545-84565544','qq':'12453242','e-mail':'[email protected]'} } f = open(file_path,'w') pickle.dump(init_contact,f) f.close() print "create new contact list successfully !" def load_contact(file_path):#通讯录加载函数 exist = os.path.isfile(file_path)#检查文件是否存在,不存在则退出 if not exist: print "The file %s is not exist! check again " % file_path exit f = open(file_path,'r') contact = pickle.load(f) pprint.pprint(contact) f.close() def add_contact(file_path):#增加用户函数(是否可以先写增加的dict,再通过update更新到contact?) exist = os.path.isfile(file_path)#检查文件是否存在,不存在则退出 if not exist: print "The file %s is not exist! check again " % file_path exit f = open(file_path,'a+') contact = pickle.load(f)#加载通讯录 #打开通讯录文本后进行新的用户添加输入 name = raw_input('>> name:' ) contact[name] = {} cellphone = raw_input('>> cellphone:' ) contact[name]['cellphone'] = cellphone qq = raw_input('>> qq:' ) contact[name]['qq'] = qq tel = raw_input('>> tel:' ) contact[name]['tel'] = tel e_mail = raw_input('>> e-mail:' ) contact[name]['e-mail'] = e_mail f.close() #写入文本中 f = open(file_path,'w+') pickle.dump(contact,f)#重写通讯录 f.close() def menu_choice():#选择查询还是增加用户信息等 print " *******Welcome to use this python contact_list******* " usage = ''' FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" ''' print usage,'\n' try: choice = raw_input('input your choice refered before >>') if choice == 'reading':#一对if else选择进行读取自己的还是别人的conact input_dir = raw_input('input someone contact list file path (eg: E:\python\list1.txt)\n >>>') path_others = r'%s' % input_dir load_contact(path_others) else: in_put = raw_input('input your contact list file path (eg: E:\python\list1.txt)\n >>>') path = r'%s' % in_put #path = r'E:\study\python\tmp\contact_list1.txt' if choice == 'search': load_contact(path) elif choice == 'adding': add_contact(path) elif choice == 'reset': create_contact(path) else: print ''' retry to run the program! %s ''' % usage except: print "something wrong!" while True: menu_choice()
实现情况:
根据题目的要求,基本功能应该都实现了,剩下的只是兼容性及容错性的问题,个人觉得可以进行改进的方面如下:
1)对dict的更新,可否用update去实现,并同步到文本?反复加载或者重写对大数据处理可能就变慢了
2)对于读取他人的通讯录,需要进行严格的限制,否则不符合pickle的格式,导致无法读取,有无其他更好的兼容方法?
3)有几个地方可以循环的更流畅,每次选择时,可否只输入一次目录地址,如果没有选择reading,都按默认选项来?这样可以方便反复增加用户,这个应该容易,循环嵌套问题。
4)查询时,可否按名字查询,或者其它选择方式?可以更加明确目标。
5)对某个用户进行删除,该如何做呢?
其它就是过程简化方面的了,暂时想到上面的想法。
下面运行起来看下结果如何:
>>> ================================ RESTART ================================ >>> *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>search input your contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp The file D:\test_tmp is not exist! check again something wrong! *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>reset input your contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp\contact_list.txt create new contact list successfully ! *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>search input your contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp\contact_list.txt {'dongf': {'cellphone': '18905555343', 'e-mail': '[email protected]', 'qq': '12453242', 'tel': '0545-84565544'}, 'lijyt': {'cellphone': '13990000343', 'e-mail': '[email protected]', 'qq': '45453242', 'tel': '0512-86565544'}, 'zhanw': {'cellphone': '15992222343', 'e-mail': '[email protected]', 'qq': '89545445', 'tel': '0523-89565544'}} *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>adding input your contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp\contact_list.txt >> name:boys >> cellphone:13487677868 >> qq:3454554655 >> tel:0513-65546567 >> e-mail:[email protected] *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>search input your contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp\contact_list.txt {'boys': {'cellphone': '13487677868', 'e-mail': '[email protected]', 'qq': '3454554655', 'tel': '0513-65546567'}, 'dongf': {'cellphone': '18905555343', 'e-mail': '[email protected]', 'qq': '12453242', 'tel': '0545-84565544'}, 'lijyt': {'cellphone': '13990000343', 'e-mail': '[email protected]', 'qq': '45453242', 'tel': '0512-86565544'}, 'zhanw': {'cellphone': '15992222343', 'e-mail': '[email protected]', 'qq': '89545445', 'tel': '0523-89565544'}} *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>reading input someone contact list file path (eg: E:\python\list1.txt) >>>D:\test_tmp\contact_list.txt {'boys': {'cellphone': '13487677868', 'e-mail': '[email protected]', 'qq': '3454554655', 'tel': '0513-65546567'}, 'dongf': {'cellphone': '18905555343', 'e-mail': '[email protected]', 'qq': '12453242', 'tel': '0545-84565544'}, 'lijyt': {'cellphone': '13990000343', 'e-mail': '[email protected]', 'qq': '45453242', 'tel': '0512-86565544'}, 'zhanw': {'cellphone': '15992222343', 'e-mail': '[email protected]', 'qq': '89545445', 'tel': '0523-89565544'}} *******Welcome to use this python contact_list******* FUNCTION YOU CAN USE: (1)SEARCH SOMEONE INFOR ON THE CONTACT,INPUT: "search" (2)ADDING SOMEONE INFOR ON THE CONTACT,INPUT: "adding" (3)READING SOMEONE'S CONTACT LIST? INPUT: "reading" (4)(!ATTENTION)RESET CONTACT_LIST OR INITIALIZE: "reset" input your choice refered before >>
上面执行的步骤是:
1、文件不存在
2、创建contact list
3、查询
4、增加用户
5、查询是否增加
6、读取其它通讯录(实际中用的是原来的)
整个流程基本是走完了,看样子还行。
总结:
这个程序中用到的知识:
1、文件的操作(打开,移除,创建)
2、pickle模块的使用,加载与生成
3、字典的初始化,增删
4、输入与字典赋值
5、循环的使用if else,while,异常处理等