用列表字典作的通讯录

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __author__=="HAI"
import re
from time import sleep
import json
import os


class Telephone_Book(object):
    """

    :param 通讯管理系统
    """

    def __init__(self):
        astr = '通讯录管理系统[0m'.center(120, '=')
        self.phone_book = []
        self.__tuple_list = [('增加姓名,手机号,地址',), ('删除姓名',), ('修改手机',),
                             ('修改地址',), ('查询所有用户',), ('根据姓名查找手机号',)]

        print(astr)
        self.__tuple = set(self.__tuple_list)
        print('输入Q退出'.center(123, '-'))

    # 0: '增加姓名,手机号,地址', 1: '删除姓名', 2: '修改手机', 3: '查询所有用户', 4: '根据姓名查找手机号'
    def __name_author(self):
        author = {'author_於': {'电话': '13******888', '地址': '北京'}}
        authorlist = []
        for itme_s in self.phone_book:
            for key in itme_s.keys():
                authorlist.append(key)

        if author.keys() not in authorlist:
            self.phone_book.insert(0, author)

    def start_fn(self):
        """
        启动主函数
        """
        if 'telphone book' not in os.listdir():
            os.mkdir('telphone book')
        if os.path.exists(r'telphone book\phone_book.josn'):
            self.phone_book = self.__dir_reade()
        else:
            self.__dir_write()
        while True:
            self.__show_directory()
            choice = input('请输入你的选择:')
            if choice == 'q' or choice == 'Q':
                self.__name_author()
                self.__dir_write()

                exit('资料已保存'.center(123, '-'))
            self.__queary_main(choice)

    def __queary_main(self, choice):
        """
        查询分支主函数
        :param choice:
        """
        choice = str(choice)
        if choice.isdigit():
            choice = int(choice)
            adict = {}
            if (choice < len(self.__tuple)) and (choice >= 0):
                for aindex, avalues in enumerate(self.__tuple):
                    adict[aindex] = avalues[0]
            if choice < len(self.__tuple):
                if adict[choice] == '增加姓名,手机号,地址':
                    self.__add_name()
                elif adict[choice] == '删除姓名':
                    self.__del_name()
                elif adict[choice] == '修改手机':
                    self.__change_phone_number()
                elif adict[choice] == '查询所有用户':
                    self.__add_color()
                    self.__query_all_users()
                elif adict[choice] == '根据姓名查找手机号':
                    self.__look_for_tel()
                elif adict[choice] == '修改地址':
                    self.__change_addres()
                elif adict[choice] == '':
                    pass
                elif adict[choice] == '':
                    pass
            else:
                print('你输入的数字不对请你重新选择Q为退出')
        else:
            print('你输入的数字不对请你重新选择:Q为退出程序')

    def __change_and_del_main(self, litdex, adict, name, flage=1):
        """
        修改地址
        修改电话
        删除姓名
        :param litdex: list
        :param adict: dict
        :param name: string
        :param flage: Bool
        """
        print('{}\n{}'.format(litdex, adict))
        number = input('》》》:')
        if number.isdigit():
            number = int(number)
            if number in litdex:
                if flage == 1:
                    del self.phone_book[number]
                    self.__add_color(False)
                elif flage == 2:
                    phone_nmber = input('请输入你的新电话')
                    phone_nmber = self.__isdigt_n_b(phone_nmber)
                    self.phone_book[number][name]['电话'] = phone_nmber
                    self.__add_color(False)
                else:
                    new_addres = input('请输入你的新地址')
                    self.phone_book[number][name]['地址'] = new_addres
                    self.__add_color(False)
                print('修改成功')
            else:
                print('输入的编号错误')
        else:
            print('输入error')

    def __change_addres(self):
        adict, row, name, litdex = self.__name_judge(flage=False)
        if row > 0:
            print('你查询的人的名字 [{1}]'
                  '有{0}个'.format(row, name), '请根据编号输入修改想要修改的地址', sep='\n')
            self.__change_and_del_main(litdex, adict, name, flage=3)
        else:
            print('你查询的人的名字 [{1}]为{0}个'.format(row, name))

    def __change_phone_number(self):
        """
        修改手机号码
        """
        adict, row, name, litdex = self.__name_judge(flage=False)
        if row > 0:
            print('你查询的人的名字 [{1}]'
                  '有{0}个'.format(row, name), '请根据编号输入修改想要修改的电话号码', sep='\n')
            self.__change_and_del_main(litdex, adict, name, flage=2)
        else:
            print('你查询的人的名字 [{1}]为{0}个'.format(row, name))

    def __add_name(self):
        """
        增加联系人
        """
        while True:
            adict = {}
            bdict = {}
            name = input('请输入你的姓名:')
            if re.match(r'[^A-Za-z0-9_]{2,6}', name):
                phone = input('请输入你的电话号码:')
                phone = self.__isdigt_n_b(phone)
                adders = input('请输入你的地址:')
                bdict['电话'] = phone
                bdict['地址'] = adders
                adict[name] = bdict
                self.phone_book.append(adict)
                print('修改成功')
                isexit = input('要继续添加姓名吗? ’Q‘ 退出')
                if isexit == 'q' or isexit == 'Q':
                    break
            else:
                print('名字错误')

    def __del_name(self):
        """
        姓名删除
        """
        adict, row, name, litdex = self.__name_judge(flage=False)
        if row > 0:
            print('你查询的人的名字 [{1}]'
                  '有{0}个'.format(row, name), '请根据编号输入想要删除的名字', sep='\n')
            self.__change_and_del_main(litdex, adict, name)

        else:
            print('你查询的人的名字 [{1}]为{0}个'.format(row, name))

    def __name_judge(self, flage=True):
        """
        姓名搜索
        :return:
        """
        name = input('请输入姓名:')
        adict = {}
        row = 0
        litdex = []
        for aindex, itmes in enumerate(self.phone_book):
            for key_s, value_s in itmes.items():
                if key_s == name:
                    row += 1
                    litdex.append(aindex)
                    if flage:
                        adict['{}.{}'.format(row, name)] = value_s
                    else:
                        adict['show{}{}'.format(row, name)] = value_s
        return adict, row, name, litdex

    def __isdigt_n_b(self, phone_number):
        """
        电话号码长度判断
        :param phone_number:
        """
        phone_number = str(phone_number)
        while not len(phone_number) == 11 or not phone_number.isdigit():
            phone_number = input('请输入正确的电话号码:')
        return phone_number

    def __query_all_users(self, flag=True):
        """
        查询所有用户
        """
        if flag:
            for all_contact in self.phone_book:
                for key_s in all_contact:
                    print(key_s, end=' ')
            print()
        else:
            pass

    def __look_for_tel(self):
        """
        根据姓名查电话地址
        :param
        :return: dict
        """
        adict, row, name, litdex = self.__name_judge()
        self.__add_color()
        print('你查询的人的名字[{1}]有{0}个'.format(row, name))
        print(adict)
        return adict

    def __add_color(self, flag=True):
        """
        add_color
        """
        if flag:
            alist = ['.', '查询中..', '正在玩命查找中...']
            for i in alist:
                print('列 表 '
                      '显示中 请稍后{:50} '.format(i))
                sleep(1)

        else:
            alist = ['.', '修改中..', '正在整理硬盘请稍后']
            for i in alist:
                print('列 表修改中'
                      '请稍后{:50} '.format(i))
                sleep(1)

    def __show_directory(self, n=1):
        """
        显示目录
        """

        for aindex, avalues in enumerate(self.__tuple):
            print(aindex, avalues[0])

    def __dir_write(self):
        """
        写入文件
        """
        with open(r'telphone book\phone_book.josn', 'w') as f:
            json.dump(self.phone_book, f)

    def __dir_reade(self):
        """
        阅读文件
        """
        with open(r'telphone book\phone_book.josn', 'r') as f:
            return json.load(f)


if __name__ == '__main__':
    notptes = Telephone_Book()
    notptes.start_fn()

猜你喜欢

转载自blog.csdn.net/Hai_peng_yu/article/details/80642983