首页Python【Python计算生态】R...

【Python计算生态】Rich——终端美化

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

Rich 是一个功能强大的 Python 库,用于在终端中创建美观的文本输出。它支持彩色文本、表格、进度条、语法高亮、Markdown 渲染等功能,能够极大地提升命令行应用程序的用户体验。
直接使用pip安装:
pip install rich
GitHub页面:
https://github.com/Textualize/rich
可以运行以下命令以测试 Rich 在终端中的输出效果:
python -m rich

02
使用


  • 示例 1:彩色文本输出

使用 Rich 的最快速方法是导入替代的 print 函数,它与内置的 print 函数具有相同的参数,可以作为内置 print 的直接替代品。如果不想覆盖 Python 的内置 print 函数,可以将 rich.print 导入为 rprint

然后就可以像平时一样将字符串或对象打印到终端。Ric会对输出进行基本的语法高亮,并格式化数据结构以使其更易读。字符串可以包含控制台标记(Console Markup),用于在输出中插入颜色和样式,关于Console Markup的具体内容可以查看官方文档:

https://rich.readthedocs.io/en/latest/markup.html#console-markup
from rich import print

print("[bold red]Hello, [green]World![/green][/bold red]", locals())

将在终端中输出以下内容(包括所有颜色和样式):


  • 示例 2:使用 Console类

Console 类是 Rich 库的核心组件,提供了更多的控制选项,用于控制终端输出的格式、颜色、样式等。

如果需要对终端中的富文本内容进行更多控制,可以导入并构造一个 Console 对象。Console 对象有一个 print 方法,其接口与内置的 print 函数相似。与内置的 print 函数不同,Rich 会自动对文本进行换行,以适应终端的宽度。

from rich.console import Console

# 创建一个 Console 对象
console = Console()

# 通过 style 关键字参数来为整个输出设置样式
console.print("Hello""World!", style="bold red")


  • 示例 3:插入表情符号

在终端输出中插入表情符号时,只需将名称放在两个冒号之间即可。

from rich.console import Console

console = Console()
console.print("Hello! :wave:", style="bold green")
console.print("Python is awesome! :snake:", style="bold red")
console.print("Let's celebrate! :party_popper:", style="bold magenta")

将在终端中输出以下内容:


  • 示例 4:绘制表格

Rich 可以使用 Unicode 框线字符渲染灵活的表格。它提供了丰富的格式化选项,包括边框样式、样式、单元格对齐等。

from rich.console import Console
# Table 类用于创建和管理表格
from rich.table import Table

# 创建一个 Console 对象
console = Console()

# 创建一个 Table 对象
# show_header=True 表示显示表格的表头
# header_style="bold magenta" 表示表头的样式为加粗且颜色为洋红色
table = Table(show_header=True, header_style="bold magenta")

# 向表格中添加一个名为 "Name" 的列
# justify="center" 表示该列中的内容居中对齐
# style="cyan" 表示该列中的内容颜色为青色
table.add_column("Name", justify="center", style="cyan", no_wrap=True)

# 向表格中添加一个名为 "Age" 的列
# 未指定其他参数时,使用默认的对齐方式(左对齐)和样式
table.add_column("Age")

# 向表格中添加一个名为 "City" 的列
# width=10 表示该列的宽度固定为 10 个字符
# no_wrap=True 表示该列中的内容不进行换行处理
table.add_column("City", justify="right", style="green", width=10, no_wrap=True)

# 依次向表格中添加行数据
table.add_row("Alice""25""New York")
table.add_row("Bob""30""Los Angeles")
table.add_row("Charlie""35""Chicago")

console.print(table)

将在终端中输出以下内容:

  • 示例 5:语法高亮

Rich 可以通过行号高亮显示各种编程语言的语法。

要高亮显示代码,需要构建一个语法对象并将其打印到控制台。也可以使用 from_path() 替代构造函数,它将从磁盘加载代码并自动检测文件类型。

from rich.console import Console
# Syntax 类用于对代码进行语法高亮处理
from rich.syntax import Syntax

# 创建一个 Console 对象
console = Console()

# 定义一个字包含 Python 代码符串变量
code = """
def hello_world():
    print("
Hello, World!")
"
""

# 创建一个 Syntax 对象
# 第一个参数 code 是要进行语法高亮处理的代码字符串
# 第二个参数 "python" 指明代码的语言为 Python
# 第三个参数 theme="monokai" 指定语法高亮的主题为 Monokai 主题
# 第四个参数 line_numbers=True 表示在显示代码时显示行号
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)

# 使用 Console 对象的 print 方法将经过语法高亮处理的代码输出到终端
console.print(syntax)

将在终端中输出以下内容:

  • 示例 6:进度条

Rich 提供了两种主要的方式来显示进度条:Progress 类和 track 函数。

  • track函数:

track 函数是一个更简单的工具,适合快速为迭代对象添加进度条。它不需要手动管理任务,只需将迭代对象传递给 track 即可。

from rich.progress import track
import time

# 为 range(100) 添加进度条
for _ in track(range(100), description="Processing..."):
    time.sleep(0.02)

终端显示效果:

  • Progress 类:

Progress 类是一个更灵活、功能更强大的工具,适合需要自定义进度条的场景。它可以同时管理多个任务,并且支持动态添加任务、更新描述、设置总步数等。

import time
from rich.progress import Progress

# 使用 with 语句创建 Progress 对象,确保资源在使用后正确释放
with Progress() as progress:
    # 为每个任务添加进度条,并设置任务描述和总工作量
    task1 = progress.add_task("[cyan]Task 1", total=100)
    task2 = progress.add_task("[magenta]Task 2", total=200)
    task3 = progress.add_task("[yellow]Task 3", total=150)

    # 模拟任务执行,直到所有任务完成
    while not progress.finished:
        # 如果任务 1 未完成,则更新其进度
        if not progress.tasks[0].finished:
            progress.update(task1, advance=1)
        # 如果任务 2 未完成,则更新其进度
        if not progress.tasks[1].finished:
            progress.update(task2, advance=2)
        # 如果任务 3 未完成,则更新其进度
        if not progress.tasks[2].finished:
            progress.update(task3, advance=1.5)
        # 模拟任务执行的延迟,使进度条更新更直观
        time.sleep(0.1)

终端显示效果:

  • 示例 7:Markdown 渲染

Rich 可以将 Markdown 输出到控制台。 要呈现 Markdown,只需构建一个 Markdown 对象,然后将其打印到控制台即可。 Markdown 是为命令行应用程序添加丰富内容的好方法。

from rich.console import Console
from rich.markdown import Markdown

console = Console()

markdown = """
# Heading 1
## Heading 2
### Heading 3

- Item 1
- Item 2
- Item 3
"
""

# 构建一个 Markdown 对象
md = Markdown(markdown)
console.print(md)

终端显示效果:

  • 示例 8:树形结构输出

Rich 有一个可以在终端生成树状视图的 Tree 类。 树形视图是展示文件系统内容或任何其他分层数据的绝佳方式。 树形视图的每个分支都可以有一个标签,标签可以是文本,也可以是任何其他丰富的呈现形式。

from rich.console import Console
# Tree 类用于创建和管理树形结构,能够方便地添加分支和叶子节点
from rich.tree import Tree

# 创建一个 Console 对象,后续将使用该对象来输出内容到终端
console = Console()

# 创建一个 Tree 对象,作为树形结构的根节点,根节点名称为 "Root"
tree = Tree("[bold]Root")

# 向根节点添加一个分支,分支名称为 "Branch 1/",并使用富文本样式设置为红色加粗
branch1 = tree.add("[red bold]Branch 1/")
# 向 branch1 分支添加一个叶子节点
branch1.add("Leaf 1")
# 向 branch1 分支再添加一个叶子节点
branch1.add("Leaf 2")

# 向根节点添加另一个分支,分支名称为 "Branch 2/",并使用富文本样式设置为绿色加粗
branch2 = tree.add("[green bold]Branch 2/")
# 向 branch2 分支添加一个叶子节点,叶子节点名称为 "Leaf 3"
branch2.add("Leaf 3")

# 使用 Console 对象的 print 方法将构建好的树形结构输出到终端
console.print(tree)

终端显示效果:

 运行以下命令可查看丰富树形视图的演示:

python -m rich.tree
  • 示例 9:创建布局

Rich 提供了一个 Layout 类,可以用来将屏幕区域划分为多个部分,每个部分可以包含独立的内容。它可以与 Live Display 一起用于创建全屏“应用程序”,也可以单独使用。

# Layout 类用于在终端中创建复杂的布局结构
from rich.layout import Layout
# Panel 类用于创建带有边框和标题的面板,可用于展示内容
from rich.panel import Panel
# Console 类用于与终端进行交互,将内容输出到终端
from rich.console import Console

# 创建一个 Layout 对象,它将作为整个布局的基础
layout = Layout()

# 使用 split_column 方法将布局对象进行垂直分割
# 这里分割成两个部分,分别命名为 "upper"(上部分)和 "lower"(下部分)
# 设置区域的大小均为 10(可以理解为高度占比,具体取决于终端环境)
layout.split_column(
    Layout(name="upper", size=10),
    Layout(name="lower", size=10)
)

# 对上一步分割出的 "lower" 部分再进行水平分割
# 使用 split_row 方法将 "lower" 部分分割成左右两部分,分别命名为 "left"(左部分)和 "right"(右部分)
# 设置左部分区域的大小为 80(可以理解为宽度占比,具体取决于终端环境)
layout["lower"].split_row(
    Layout(name="left", size=80),
    Layout(name="right"),
)

# 创建一个 Panel 对象,为面板设置标题及显示文本
left_panel = Panel("This is the left side of the layout.", title="Left Panel")
# 将创建好的面板更新到布局中名为 "left" 的区域
layout["left"].update(left_panel)

# 创建一个 Panel 对象,为面板设置标题及显示文本
right_panel = Panel("This is the right side of the layout.", title="Right Panel")
# 将创建好的面板更新到布局中名为 "right" 的区域
layout["right"].update(right_panel)

# 创建一个 Console 对象,用于后续将布局输出到终端
console = Console()
# 使用 Console 对象的 print 方法将整个布局打印输出到终端
console.print(layout)

终端显示效果:


更多内容可以前往官方文档查看:

https://rich.readthedocs.io/en/latest/

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments