テーブル

Rich の Table クラスは、端末に表形式のデータをレンダリングする様々な方法を提供します。

テーブルをレンダリングするには、Table オブジェクトを構築し、add_column() でカラムを追加し、add_row() で行を追加します。そして、それをコンソールに出力します。

例を次に示します

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

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

table.add_column("Released", justify="right", 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()
console.print(table)

これは、次の出力を生成します

                           Star Wars Movies                           
┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃     Released  Title                                  Box Office ┃
┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ Dec 20, 2019  Star Wars: The Rise of Skywalker     $952,110,690 │
│ May 25, 2018  Solo: A Star Wars Story              $393,151,347 │
│ Dec 15, 2017  Star Wars Ep. V111: The Last Jedi  $1,332,539,889 │
│ Dec 16, 2016  Rogue One: A Star Wars Story       $1,332,439,889 │
└──────────────┴───────────────────────────────────┴────────────────┘

Rich は、コンテンツに最適なカラムサイズを計算し、端末の幅がコンテンツに収まらない場合は、テキストを折り返して収めます。

注記

add_row メソッドでは、テキストの追加に制限されません。Rich がレンダリングする方法を知っているもの(別のテーブルを含む)を追加できます。

テーブルオプション

テーブルの外観を定義するために使用できる Table コンストラクタには、多くのキーワード引数があります。

  • title テーブルのタイトル(テーブルの上に表示されるテキスト)を設定します。

  • caption テーブルのキャプション(テーブルの下に表示されるテキスト)を設定します。

  • width テーブルの希望する幅を設定します(自動幅計算を無効にします)。

  • min_width テーブルの最小幅を設定します。

  • box テーブルグリッドの ボックス スタイルのいずれか、またはグリッドなしの場合は None を設定します。

  • safe_box True に設定すると、テーブルは Unicode ではなく ASCII 文字を生成するように強制されます。

  • padding セルにパディングを設定するための整数、または 1、2、または 4 つの値のタプル。

  • collapse_padding True の場合、隣接するセルのパディングはマージされます。

  • pad_edge False に設定すると、テーブルの端のパディングが削除されます。

  • expand True に設定すると、テーブルをいっぱいに拡張します。

  • show_header ヘッダーを表示するには True、無効にするには False に設定します。

  • show_footer フッターを表示するには True、無効にするには False に設定します。

  • show_edge False に設定すると、テーブルの周りのエッジラインが無効になります。

  • show_lines True に設定すると、ヘッダー/フッターだけでなく、行間の線も表示されます。

  • leading 行間の追加スペース。

  • style テーブル全体に適用するスタイル。例:「on blue」

  • row_styles 交互の行をスタイル設定するためのスタイルのリストに設定します。例:["dim", ""] で*ゼブラストライプ*を作成します

  • header_style ヘッダーのデフォルトスタイルを設定します。

  • footer_style フッターのデフォルトスタイルを設定します。

  • border_style 境界文字のスタイルを設定します。

  • title_style タイトルのスタイルを設定します。

  • caption_style キャプションのスタイルを設定します。

  • title_justify タイトルの justify メソッドを設定します("left"、 "right"、 "center"、または "full")

  • caption_justify キャプションの justify メソッドを設定します( "left"、 "right"、 "center"、または "full")

  • highlight True に設定すると、セル内容の自動ハイライトが有効になります。

枠線スタイル

プリセットの Box オブジェクトのいずれかをインポートし、テーブルコンストラクタの box 引数を設定することで、枠線スタイルを設定できます。スターウォーズのテーブルの外観を変更する例を次に示します

from rich import box
table = Table(title="Star Wars Movies", box=box.MINIMAL_DOUBLE_HEAD)

その他のボックススタイルについては、ボックス を参照してください。

枠線を完全に削除するには、box=None を設定することもできます。

Table クラスは、枠線のレンダリング方法、カラムのスタイルと配置など、テーブルのルックアンドフィールを設定するための多くの設定オプションを提供します。

デフォルトでは、テーブルはヘッダーの下にのみ線を表示します。すべての行の間に線を表示する場合は、コンストラクタに show_lines=True を追加します。

add_row() の呼び出しで end_section=True を設定するか、add_section() を呼び出して現在行と後続の行の間に線を追加することで、次の行に線を強制的に表示することもできます。

空のテーブル

カラムのないテーブルを出力すると、空白行が生成されます。テーブルを動的に構築していて、データソースにカラムがない場合は、別のものを出力したい場合があります。その方法を次に示します

if table.columns:
    print(table)
else:
    print("[i]No data...[/i]")

カラムの追加

Table コンストラクタの位置引数でカラムを指定することで、カラムを追加することもできます。たとえば、次のように 3 つのカラムを持つテーブルを構築できます

table = Table("Released", "Title", "Box Office", title="Star Wars Movies")

これにより、カラムのテキストのみを指定できます。幅やスタイルなどの他の属性を設定する場合は、Column クラスを追加できます。例を次に示します

from rich.table import Column, Table
table = Table(
    "Released",
    "Title",
    Column(header="Box Office", justify="right"),
    title="Star Wars Movies"
)

カラムオプション

カラムの外観を変更するために設定できるオプションがいくつかあります。

  • header_style ヘッダーのスタイルを設定します。例:「bold magenta」

  • footer_style フッターのスタイルを設定します。

  • style カラムに適用されるスタイルを設定します。たとえば、「on green」で背景を設定することで、カラムをハイライト表示するために使用できます。

  • justify テキストの justify を "left"、 "center"、 "right"、または "full" のいずれかに設定します。

  • vertical カラム内のセルの垂直方向の配置を "top"、 "middle"、または "bottom" のいずれかに設定します。

  • width 行の幅を指定した文字数に明示的に設定します(自動計算を無効にします)。

  • min_width 整数に設定すると、カラムがこの量より小さくならないようにします。

  • max_width 整数に設定すると、カラムがこの量を超えて大きくならないようにします。

  • ratio カラム幅を設定するための比率を定義します。たとえば、合計比率が 6 の 3 つのカラムがあり、ratio=2 の場合、カラムは使用可能なサイズの 3 分の 1 になります。

  • no_wrap True に設定すると、このカラムが折り返されなくなります。

垂直方向の配置

カラムの `vertical` パラメータを設定することで、カラムの垂直方向の配置を定義できます。また、テキストまたはレンダリング可能オブジェクトを Align クラスでラップすることで、セルごとにこれを行うこともできます

table.add_row(Align("Title", vertical="middle"))

グリッド

Table クラスは、優れたレイアウトツールとしても使用できます。ヘッダーとボーダーを無効にすると、ターミナル内にコンテンツを配置するために使用できます。代替コンストラクタである grid() は、そのようなテーブルを作成できます。

たとえば、次のコードは、ターミナルの左右両端に揃えられた2つのテキストを1行に表示します。

from rich import print
from rich.table import Table

grid = Table.grid(expand=True)
grid.add_column()
grid.add_column(justify="right")
grid.add_row("Raising shields", "[bold magenta]COMPLETED [green]:heavy_check_mark:")

print(grid)