rich简介
rich
是一个用于美化终端的Python库,下面这幅图展示了它的主要功能。
rich的文档提供了详细的说明:
Rich 是一个 Python 库,可以为您在终端中提供富文本和精美格式。
Rich 的 API 让在终端输出颜色和样式变得很简单。此外,Rich 还可以绘制漂亮的表格、进度条、markdown、语法高亮的源代码以及栈回溯信息(tracebacks)等——开箱即用。
安装:python -m pip install rich
预览:
在终端运行python -m rich
,可以看到图2
的效果。
rich常用功能
下面根据How to Use the Rich Library with Python,介绍一下rich
的常用功能。
1. 替代print
可以使用rich
的print
函数替代内置的print
。
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals())
2. 在交互命令行(REPL)使用
>>> from rich import pretty
>>> pretty.install()
>>> locals()
3. 控制终端格式
为了完全控制终端格式,Rich 提供了一个 Console
类。
from rich.console import Console
console = Console()
def merge_dict(dict_one, dict_two):
merged_dict = dict_one | dict_two
console.log(merged_dict, log_locals=True)
merge_dict({'id': 1}, {'name': 'Ashutosh'})
我们创建了一个Console
对象,然后使用log
方法打印了一个合并后的字典。log
方法和print
方法类似,但是添加了一些帮助调试的信息,例如我们用log_locals
打印局部变量。
Console提供了很多功能,如控制终端的颜色、样式、大小以及输出不同内容。详细的说明可以参考Console API
4. 使用inspect检查对象
from rich import inspect
import rich
inspect(rich)
5. 使用Tree显示文件系统等树状结构
from rich.tree import Tree
from rich import print as rprint
tree = Tree("Family Tree")
tree.add("Mom")
tree.add("Dad")
tree.add("Brother").add("Wife")
tree.add("[red]Sister").add("[green]Husband").add("[blue]Son")
rprint(tree)
6. 显示进度条
from rich.progress import track
from time import sleep
def process_data():
sleep(0.02)
for _ in track(range(100), description='[green]Processing data'):
process_data()
如果我们想记录特定任务完成执行的时间,我们可以用console.status
from rich.console import Console
from time import sleep
console = Console()
data = [1, 2, 3, 4, 5]
with console.status("[bold green]Fetching data...") as status:
while data:
num = data.pop(0)
sleep(1)
console.log(f"[green]Finish fetching data[/green] {num}")
console.log(f'[bold][red]Done!')
如果需要在显示中执行多个任务或想要自定义进度显示中的列,则可以直接使用 Progress
类。创建 Progress 对象后,使用add_task()
添加任务,使用 update_progress()
更新进度。
import time
from rich.progress import Progress
with Progress() as progress:
task1 = progress.add_task("[red]Downloading...", total=100)
task2 = progress.add_task("[green]Processing...", total=100)
task3 = progress.add_task("[cyan]Installing...", total=100)
while not progress.finished:
progress.update(task1, advance=0.9)
progress.update(task2, advance=0.6)
progress.update(task3, advance=0.3)
time.sleep(0.02)
Progress
类旨在用作上下文管理器,自动启动和停止进度显示。
7. 显示列
Rich 可以将文本(或其他Rich renderables对象)呈现 Columns中。
import json
from urllib.request import urlopen
from rich.console import Console
from rich.columns import Columns
from rich.panel import Panel
def get_content(user):
"""Extract text from user dict."""
country = user["location"]["country"]
name = f"{user['name']['first']} {user['name']['last']}"
return f"[b]{name}[/b]\n[yellow]{country}"
console = Console()
users = json.loads(urlopen("https://randomuser.me/api/?results=30").read())["results"]
user_renderables = [Panel(get_content(user), expand=True) for user in users]
console.print(Columns(user_renderables))
8. 显示表格
Rich的Table
类提供了多种将表格数据呈现到终端的方法。Table
类具有 add_column()
和add_row()
方法,用于将列和行分别添加到Table中。
from rich.console import Console
from rich.table import Table
table = Table(title="Todo List")
table.add_column("S. No.", style="cyan", no_wrap=True)
table.add_column("Task", style="magenta")
table.add_column("Status", justify="right", style="green")
table.add_row("1", "Buy Milk", "✅")
table.add_row("2", "Buy Bread", "✅")
table.add_row("3", "Buy Jam", "❌")
console = Console()
console.print(table)