创建简单的“地址簿”程序。在这个程序中,你可以添加、修改、删除和搜索你的联系人(姓名、电话和地址等等)。这些详细信息应该被保存下来以便以后提取。下面的小程序希望对小伙伴们有点启发。

# -*- coding:utf8 -*-
import cPickle as p
class Test:

    f = file(r"D:\python\Python27\testProject\test\myFirstTest.data")
    if len(f.read()) == 0:
        f2 = file(r"D:\python\Python27\testProject\test\myFirstTest.data", 'w')  # 打开文件
        personInfos = {} # 定义一个字典用来存放多条个人信息(键使用id,值使用新的字典{姓名:,电话:,地址:})
        p.dump(personInfos, f2)
        f2.close()
    else:
        f3=file(r"D:\python\Python27\testProject\test\myFirstTest.data")  # 此处多打开一个f3,是因为在使用cPickle时打开的文件与dump和load要在同一级别,不能在if等这种下一个级别(会报错EOFError)
        personInfos = p.load(f3)  # 取出之前存入的人员信息字典
        f3.close()

    f.close()

    print "人员信息中已存在如下信息:"
    print personInfos


    def addAddress(self, times): # 调用一次增加一个人(只会生成一个id)入参为一个人想要修改的项的数目

        address = {}  # 定义一个空的字典,来存放新增的这个人的数据
        while True:  # 本次循环用来填充address字典
            if times == 0:  # 根据入参循环向空的字典中增加键值对
                break
            times = times - 1
            key = raw_input("输入键(name/phone/address):")
            value = raw_input("输入该键对应的值:")
            address[key] = value
        newkeyList = self.personInfos.keys()  # 取键为列表
        length = len(newkeyList)  # 取得整个人员字典的长度(键的列表长的),类的类变量personInfos前面要添加self或Test(类名)座位前缀才可以在方法中使用
        newkeyList.sort()  # 对列表排序
        print newkeyList
        if length == 0:  # 如果人员字典长度为0,则从第0位开始添加数据
            self.personInfos[0] = address
        else:
            self.personInfos[(newkeyList[length - 1]) + 1] = address  # 若人员字典长度不为0,则从已有键的下一位添加数据
        print self.personInfos

        f = file(r"D:\python\Python27\testProject\test\myFirstTest.data", 'w')  # 打开文件
        p.dump(self.personInfos,f)  # 将人员信息字典,作为对象存在myFirstTest.data文件中,本次新生成的personInfos会覆盖原来.data文件中的对象
        f.close()  # 关闭文件

    def delAddress(self, id):

        del self.personInfos[id]
        print self.personInfos

        f = file(r"D:\python\Python27\testProject\test\myFirstTest.data", 'w')  # 打开文件
        p.dump(self.personInfos, f)  # 将人员信息字典,作为对象存在myFirstTest.data文件中,本次新生成的personInfos会覆盖原来.data文件中的对象
        f.close()  # 关闭文件
    def updateAddress(self, id):
        print "该id对应人员信息如下:"
        print self.personInfos[id]

        updatedirc = self.personInfos[id]
        length = len(updatedirc.keys())
        while True:
            if length == 0:
                break
            length = length-1
            key = raw_input("输入想要更新的key:")
            value = raw_input("输入想要更新的value:")
            updatedirc[key]=value
            q = raw_input("是否继续修改?(Y/N)")
            if q == 'N':
                break

        print self.personInfos

        f = file(r"D:\python\Python27\testProject\test\myFirstTest.data", 'w')  # 打开文件
        p.dump(self.personInfos, f)  # 将人员信息字典,作为对象存在myFirstTest.data文件中,本次新生成的personInfos会覆盖原来.data文件中的对象
        f.close()  # 关闭文件
    def selectAddress(self,id):
         selectdirc = self.personInfos[id]
         print selectdirc


    def __init__(self):
        print "start"


test = Test()
keyWord = raw_input("请输入想要进行的操作(1.addAddress新增;2.delAddress删除;3.updataAddress更新;4.selectAddress查询)")
if keyWord == 'addAddress':
    inputStr = raw_input("请输入想要增加的项数目(0-3):")
    n=int(inputStr)
    test.addAddress(n)  # 注意接收的参数类型,此处需要int

elif keyWord == 'delAddress':
    id = raw_input("输入想要删除的id:")
    test.delAddress(int(id))
elif keyWord == 'updateAddress':
    id = raw_input("输入想要修改的id:")
    test.updateAddress(int(id))
else:
    id = raw_input("输入想要删除的id:")
    test.selectAddress(int(id))