Python使用Rich type和TinyDB构建联系人通讯录

目录
  • 引言
  • 工具准备
  • 通讯录特征
  • 如何创建联系人模型
  • 如何使用TinyDB创建数据库
  • 如何使用typer创建命令行
  • 如何使用Rich设计终端
  • 如何使用打字命令连接数据库操作

引言

我们将学习如何构建一个终端应用程序(CLI应用程序)来管理我们的通讯录

我们将使用type来构建CLI应用程序,使用Rich来创建彩色终端输出,使用TinyDB来创建数据库。

工具准备

我们将在这个项目中使用一些外部库。让我们来了解一下,并逐一安装。 但是在我们安装之前,让我们创建一个虚拟环境并激活它。 我们将使用 virtualenv 创建一个虚拟环境。Python现在附带了一个预先安装的virtualenv库。因此,要创建一个虚拟环境,你可以使用下面的命令:

python -m venv env

上面的命令将创建一个名为env的虚拟环境。现在,我们需要使用下面的命令来激活环境:

. env/Scripts/activate

要验证环境是否已被激活,可以在终端中看到(env)。现在,我们可以安装库了。

Rich是一个Python库,用于向终端编写富文本(带有颜色和样式),并用于显示高级内容,如表、标记和语法高亮显示代码。

要安装Rich,使用以下命令:

pip install Rich

Typer是一个用于构建CLI应用程序的库。

要安装Typer,使用以下命令:

pip install Typer

TinyDB是一个纯Python编写的面向文档的数据库,没有外部依赖。

要安装TinyDB,使用下面的命令:

pip install TinyDB

通讯录特征

我们的通讯录应用程序将是一个基于终端的应用程序。类似于Todo应用程序,我们可以对其执行以下操作:

Add (or Create) : You can add a new contact in the contact book.

Show (or Read) : You can see all your contacts saved in the contact book.

Edit (or Update) : You can edit the contacts saved in the contact book.

Remove (or Delete) : You can delete the contacts saved in the contact book.

如何创建联系人模型

首先,我们将为Contact创建一个自定义类或模型。想想接触应该包含的所有领域。 我能想到这些字段——姓名和联系电话。如果您能想到更多,可以将它们添加到您的模型中。我们现在要继续调查这两位。 创建一个名为contact_book的目录。在其中,创建一个名为model.py的Python文件。在文件中增加如下内容:

import datetime
class Contact:
    def __init__ (self, name, contact_number, position=None, date_created=None, date_updated=None):
        self.name = name
        self.contact_number = contact_number
        self.position = position
        self.date_created = date_created if date_created is not None else datetime.datetime.now().isoformat()
        self.date_updated = date_updated if date_updated is not None else datetime.datetime.now().isoformat()
    def __repr__ (self) -> str:
        return f"({self.name}, {self.contact_number}, {self.position}, {self.date_created}, {self.date_updated})"

我们创建了一个名为Contact的类,它接受两个强制参数:name和contact_number。

除了这两个参数外,它还接受三个可选参数:position、date_created和date_updated。如果没有传递这三个可选参数,它们将分别默认为当前索引和当前时间。

此外,我们还定义了repr方法,该方法以更易于阅读的方式返回对象。

如何使用TinyDB创建数据库

现在,让我们设置TinyDB并创建一个数据库

在contact_book目录中,创建一个init.py文件,并添加以下内容:

from tinydb import TinyDB, Query
db = TinyDB('contact-book.json')
db.default_table_name = 'contact-book'
ContactQuery = Query()

我们已经创建了TinyDB类的一个实例,并将文件名传递给它。这将创建一个JSON文件通讯录。Json,我们的数据将被存储。要从这个数据库检索数据,我们需要一个tinydb库中Query类的实例。

现在,让我们定义将用于与数据库交互的不同函数。在contact_book目录中,创建一个database.py文件,并在其中添加以下内容:

from typing import List
import datetime
from contact_book.model import Contact
from contact_book import db, ContactQuery
def create(contact: Contact) -> None:
    contact.position = len(db)+1
    new_contact = {
        'name': contact.name,
        'contact_number': contact.contact_number,
        'position': contact.position,
        'date_created': contact.date_created,
        'date_updated': contact.date_updated
    }
    db.insert(new_contact)
def read() -> List[Contact]:
    results = db.all()
    contacts = []
    for result in results:
        new_contact = Contact(result['name'], result['contact_number'], result['position'],
                              result['date_created'], result['date_updated'])
        contacts.append(new_contact)
    return contacts
def update(position: int, name: str, contact_number: str) -> None:
    if name is not None and contact_number is not None:
        db.update({'name': name, 'contact_number': contact_number},
                  ContactQuery.position == position)
    elif name is not None:
        db.update({'name': name}, ContactQuery.position == position)
    elif contact_number is not None:
        db.update({'contact_number': contact_number},
                  ContactQuery.position == position)
def delete(position) -> None:
    count = len(db)
    db.remove(ContactQuery.position == position)
    for pos in range(position+1, count):
        change_position(pos, pos-1)
def change_position(old_position: int, new_position: int) -> None:
    db.update({'position': new_position},
              ContactQuery.position == old_position)

我们定义了四个不同的函数——create()、read()、update()和delete()用于上面提到的每个操作。我们使用position属性来识别特定的联系人。change_position()函数负责在删除联系人时保持联系人的位置。

如何使用typer创建命令行

现在让我们使用type创建CLI。在contact_book目录之外,创建一个main.py文件,并添加以下内容。如何使用type创建命令行

import typer
app = typer.Typer()
@app.command(short_help='adds a contact')
def add(name: str, contact_number: str):
    typer.echo(f"Adding {name}, {contact_number}")
@app.command(short_help='shows all contacts')
def show():
    typer.echo(f"All Contacts")
@app.command(short_help='edits a contact')
def edit(position: int, name: str = None, contact_number: str = None):
    typer.echo(f"Editing {position}")
@app.command(short_help='removes a contact')
def remove(position: int):
    typer.echo(f"Removing {position}")
if __name__ == " __main__":
    app()

首先,我们从类型库中创建Typer类的一个实例。然后,我们为上面讨论的四个操作创建四个单独的函数。我们使用@app.command()装饰器将每个函数绑定到一个命令中。我们还添加了short_help来帮助用户使用命令。

要添加联系人,我们需要name和contact_number参数。为了展示隐形人,我们什么都不需要。要编辑联系人,我们肯定需要位置,而name和contact_number参数是可选的。要移除接触点,我们只需要位置。

目前,我们没有在方法内部进行任何操作。我们只是使用typing类中的echo方法进行打印。在main方法中,我们只需要调用app()对象。

如果你运行这个应用程序,你会得到一个类似的输出:

如何使用Rich设计终端

我们希望在一个漂亮的表格布局中使用不同的颜色显示联系人。Rich 可以帮我们。

现在让我们修改main.py中的show()函数,因为它负责在终端上打印联系人。

from rich.console import Console
from rich.table import Table
console = Console()
@app.command(short_help='shows all contacts')
def show():
    contacts = [("Ashutosh Krishna", "+91 1234554321"),
                ("Bobby Kumar", "+91 9876556789")]
    console.print("[bold magenta]Contact Book[/bold magenta]", "")
    if len(contacts) == 0:
        console.print("[bold red]No contacts to show[/bold red]")
    else:
        table = Table(show_header=True, header_style="bold blue", show_lines=True)
        table.add_column("#", style="dim", width=3, justify="center")
        table.add_column("Name", min_width=20, justify="center")
        table.add_column("Contact Number", min_width=12, justify="center")
        for idx, contact in enumerate(contacts, start=1):
            table.add_row(str(idx), f'[cyan]{contact[0]}[/cyan]', f'[green]{contact[1]}[/green]')
        console.print(table)

我们首先创建了Console类的一个实例。在show()方法中,我们现在有一个虚拟的联系人列表。使用console对象,我们用粗体红色打印标题。

接下来,我们创建一个表并添加列。现在,我们对联系人进行迭代,并将它们作为不同颜色的单独行放入表中。最后,我们打印表格。

如何使用打字命令连接数据库操作

现在,让我们进行最后一步,将数据库操作与命令连接起来。也就是说,当我们运行一个命令时,它应该与数据库进行适当的交互。

import typer
from rich.console import Console
from rich.table import Table
from contact_book.model import Contact
from contact_book.database import create, read, update, delete
app = typer.Typer()
console = Console()
@app.command(short_help='adds a contact')
def add(name: str, contact_number: str):
    typer.echo(f"Adding {name}, {contact_number}")
    contact = Contact(name, contact_number)
    create(contact)
    show()
@app.command(short_help='shows all contacts')
def show():
    contacts = read()
    console.print("[bold magenta]Contact Book[/bold magenta]", "")
    if len(contacts) == 0:
        console.print("[bold red]No contacts to show[/bold red]")
    else:
        table = Table(show_header=True,
                      header_style="bold blue", show_lines=True)
        table.add_column("#", style="dim", width=3, justify="center")
        table.add_column("Name", min_width=20, justify="center")
        table.add_column("Contact Number", min_width=12, justify="center")
        for idx, contact in enumerate(contacts, start=1):
            table.add_row(str(
                idx), f'[cyan]{contact.name}[/cyan]', f'[green]{contact.contact_number}[/green]')
        console.print(table)
@app.command(short_help='edits a contact')
def edit(position: int, name: str = None, contact_number: str = None):
    typer.echo(f"Editing {position}")
    update(position, name, contact_number)
    show()
@app.command(short_help='removes a contact')
def remove(position: int):
    typer.echo(f"Removing {position}")
    delete(position)
    show()
if __name__ == " __main__":
    app()

在上面的代码中,我们使用了前面创建的create()、read()、update()和delete()。

以上就是Python使用Rich type和TinyDB构建联系人通讯录应用程序的详细内容,更多关于Python构建通讯录的资料请关注我们其它相关文章!

(0)

相关推荐

  • python数据库编程 Mysql实现通讯录

    本文实例为大家分享了Mysql实现通讯录的具体代码,供大家参考,具体内容如下 #-*-code:utf-8-*- import pymysql def CreateTable(): hcon=pymysql.connect(host='localhost',user='root',password='lptpwd',database='contract',charset='utf8') hcur=hcon.cursor() hcur.execute('drop table if exists c

  • python实现简易通讯录修改版

    描述: 上一篇博客我写了一个简单的通讯录,但是还是觉得不够完美: 需要输入ID,虽然ID是主键,但是没有实现自增功能: 忘记加电话号码了: 如果插入用户名相同,则后续的查.改.删功能受到影响: 所以,我这个修改版主要修正了以上三点缺陷.具体如下 将用户ID设置为自增字段,即就是不用输入ID,程序会自动帮你将插入的用户进行排序并附上ID,默认从1开始:SQLite实现主键自增功能,请查看SQLiteAUTOINCREMENT/自动递增这篇博客. 创建表时增加了电话号码字段: 插入的用户名不能重复:

  • 如何用Python写一个简单的通讯录

    目录 用Python写一个简单的通讯录 一.构思 1.定义空列表和一个空字典来存储 2.定义功能选项 3.添加通讯录功能 3.2 删除学员功能 二.整体项目演示 用Python写一个简单的通讯录 一.构思 1.定义空列表和一个空字典来存储 list1=[] #用于储存字典中的信息 dict1={} #用于储存联系人信息 2.定义功能选项 def Menu(): print('请选择功能--------\n' '1.添加学员\n' '2.删除学员\n' '3.修改学员\n' '4.查询学员\n'

  • python实现学生通讯录管理系统

    本文实例为大家分享了python实现学生通讯录管理系统的具体代码,供大家参考,具体内容如下 功能模块分析: 1.首页(菜单功能) 2.添加学生 3.删除学生 4.修改学生 5.统计通讯录联系人人数 6.获取所有学生通讯信息 代码如下: def main(): while True: menu() number = int(input("请输入需要实现的操作的序号:")) if number==1: insert() #添加学生 if number==2: delete() #删除学生

  • python实现手机通讯录搜索功能

    本文实例为大家分享了python通过输入联系人首字母查询联系人的具体代码,供大家参考,具体内容如下 # -*- coding:utf-8 -*- # 练习2: # 模拟手机通讯录搜索功能 class PERSON(object): def __init__(self): self.name_list = ['zhangsan', 'zhangsanfeng', 'zhaoliu', 'wangwu', 'wulong', 'wanda', 'lisi', 'liuyang','luoxiaoxi

  • Python编写通讯录通过数据库存储实现模糊查询功能

    1.要求 数据库存储通讯录,要求按姓名/电话号码查询,查询条件只有一个输入入口,自动识别输入的是姓名还是号码,允许模糊查询. 2.实现功能 可通过输入指令进行操作. (1)首先输入"add",可以对通讯录进行添加联系人信息. sql1 = 'insert into TA(ID,NAME,AGE,ADDRESS,TELENUMBER)' sql1 += 'values("%d","%s","%d","%s",

  • Python使用Rich type和TinyDB构建联系人通讯录

    目录 引言 工具准备 通讯录特征 如何创建联系人模型 如何使用TinyDB创建数据库 如何使用typer创建命令行 如何使用Rich设计终端 如何使用打字命令连接数据库操作 引言 我们将学习如何构建一个终端应用程序(CLI应用程序)来管理我们的通讯录 我们将使用type来构建CLI应用程序,使用Rich来创建彩色终端输出,使用TinyDB来创建数据库. 工具准备 我们将在这个项目中使用一些外部库.让我们来了解一下,并逐一安装. 但是在我们安装之前,让我们创建一个虚拟环境并激活它. 我们将使用 v

  • python数据类型判断type与isinstance的区别实例解析

    在项目中,我们会在每个接口验证客户端传过来的参数类型,如果验证不通过,返回给客户端"参数错误"错误码. 这样做不但便于调试,而且增加健壮性.因为客户端是可以作弊的,不要轻易相信客户端传过来的参数. 验证类型用type函数,非常好用,比如 >>type('foo') == str True >>type(2.3) in (int,float) True 既然有了type()来判断类型,为什么还有isinstance()呢? 一个明显的区别是在判断子类. type(

  • python给指定csv表格中的联系人群发邮件(带附件的邮件)

    以下为使用python给指定路径的csv表格中的联系人群发带附件的邮件(csv表格的第一列为联系人姓名,第二列为联系人邮箱账号)的代码,详情见注释. import time import csv #用于读取收件人列表 import smtplib #用于发送邮件 from email.header import Header #Header用于构造邮件头 from email.mime.text import MIMEText #MIMEText用于构造文本邮件 from email.mime.

  • 浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list.dict 等可以包含不同的数据类型,因此不可调用dtype()函数 2)np.array 中要求所有元素属于同一数据类型,因此可调用dtype()函数 astype() 改变np.array中所有数据元素的数据类型. 备注:能用dtype() 才能用 astype() 测试代码: import nu

  • Python类型提示Type Hints示例详解

    目录 为什么会有类型提示 解决上述问题,类型提示 类型提示分类 变量类型提示 没有使用类型提示 使用了类型提示 变量类型提示-元组打包 变量类型提示-元组解包 在类里面使用 函数参数类型提示 栗子一 栗子二 总结 为什么会有类型提示 Python是一种动态类型语言,这意味着我们在编写代码的时候更为自由,运行时不需要指定变量类型 但是与此同时 IDE 无法像静态类型语言那样分析代码,及时给我们相应的提示,比如字符串的 split 方法 def split_str(s): strs = s.spli

  • 详解Python中的 type()函数

    目录 你好类型 type()和数字 序列类型 自定义数据类型 Python type() 函数摘要 将通过各种例子来了解如何在 Python 中使用 type() 函数. 你好类型 打印 "Hello World "几乎是你学习任何编程语言时做的第一件事.让我们用 type() 函数来检查一下. my_var = 'Hello World' print(type(my_var)) <class 'str'> 我们将在本文的所有例子中使用同一个 my_var变量用于本教程中的

  • Python如何使用type()函数查看数据的类型

    目录 使用type()查看数据的类型 使用type来定义类 我们先来看一张图 仔细观察 我们上代码测试一下 使用type()查看数据的类型 在Python中, 可以使用type()类型来查看数据的类型: >>> type(3) <class 'int'> >>> type("123") <class 'str'> >>> type(True) <class 'bool'> >>>

  • python爬虫入门教程--利用requests构建知乎API(三)

    前言 在爬虫系列文章 优雅的HTTP库requests中介绍了 requests 的使用方式,这一次我们用 requests 构建一个知乎 API,功能包括:私信发送.文章点赞.用户关注等,因为任何涉及用户操作的功能都需要登录后才操作,所以在阅读这篇文章前建议先了解Python模拟知乎登录 .现在假设你已经知道如何用 requests 模拟知乎登录了. 思路分析 发送私信的过程就是浏览器向服务器发送一个 HTTP 请求,请求报文包括请求 URL.请求头 Header.还有请求体 Body,只要把

  • python中的type,元类,类,对象用法

    目录 type,元类,类,对象 简单描述 类的生成方式 元类 元类type学习总结 type的作用是干什么呢? type,元类,类,对象 简单描述 1.type是python内建元类,新建的元类需要继承type 2.元类用来创建类,类用来创建对象 类的生成方式 传统定义通过声明关键字class #1.创建Person类 #2.继承object #3.拥有属性eat class Person(object):     def eat(self,food="rice"):        

  • 详解Python中的type()方法的使用

    type()方法返回传递变量的类型.如果传递变量是字典那么它将返回一个字典类型. 语法 以下是type()方法的语法: type(dict) 参数 dict -- 这是字典 返回值 此方法返回传递变量的类型. 例子 下面的例子显示type()方法的使用 #!/usr/bin/python dict = {'Name': 'Zara', 'Age': 7}; print "Variable Type : %s" % type (dict) 当我们运行上面的程序,它会产生以下结果: Var

随机推荐