Will McGugan:用Rich导出终端输出的SVG

211 阅读2分钟

Rich最近增加了两个有趣的新功能。

第一个功能是支持SVG。用Rich打印到终端的任何东西都可以被捕获并导出为SVG文件。该输出有点像屏幕截图,但在Rich本身中生成(它不会偷看你的桌面)。

© 2022 Will McGugan

从Rich生成的SVG(转换为PNG)。

我认为这些SVG对于分享终端输出是很有用的,特别是对于文档。

保存SVG的API与保存/导出文本和HTML的方法的工作方式相同。下面是生成上述图片的代码。

from rich.console import Console
from rich.table import Table

table = Table(title="Star Wars Movies")

table.add_column("Released", style="cyan", no_wrap=True)
table.add_column("Title", style="magenta")
table.add_column("Box Office", justify="right", style="green")

table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690")
table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889")
table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889")

console = Console(record=True)
console.print(table, justify="center")
console.save_svg("table.svg", title="save_table_svg.py")

import os
import webbrowser

webbrowser.open(f"file://{os.path.abspath('table.svg')}")

第二个新功能是由Martin Larralde贡献的,他经常需要处理大型数据集,在那里你可能想看到一个进度条。如果读取文件的代码不在你的控制范围内,整合Rich的进度条就很难做到。例如,如果你使用标准库中的json.load -- 没有简单的挂钩来更新进度条。

马丁的解决方案是将类文件对象包裹到该读数中,并寻求相应地更新进度条。这样,当你把一个类文件对象传递给第三方API时,你会得到一个进度条,跟踪该文件已经被读取多少。

下面是你如何读取和解码一个大型JSON文件并显示进度。

import json

import rich.progress

with rich.progress.open("cats.json") as cats_file:
    data = json.load(cats_file)

现在添加一个进度条可以像用rich.progress.open 替换open 一样简单。

更多细节请参见RichRepository。你可能还想看看Rich的姐妹项目Textual