2024年3月14日 星期四

Python 學習筆記 : 豐富終端機視覺效果的 rich 套件

昨天終於把 Hahow 企業版的 "AI 一把抓" 的兩門課程看完, 其中學到一個好用的套件 rich, 它可以將字典物件以整齊易讀方式列印出來, 而不是像 print() 那樣將鍵值對全部串在一起印出來, 看起來是一坨亂亂的資料. 不過這只是 rich 的一個功能而已, 如其名所示, rich 主要的目的是讓 Python 命令列的顯示功能更豐富, 參考官網介紹 :



一. 安裝 rich 套件 :    

Rich 是第三方套件, 必須用 pip install 先安裝才能使用 :

pip install rich

D:\python\test>pip install rich    
Collecting rich
  Downloading rich-13.7.1-py3-none-any.whl.metadata (18 kB)
Collecting markdown-it-py>=2.2.0 (from rich)
  Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB)
Collecting pygments<3.0.0,>=2.13.0 (from rich)
  Downloading pygments-2.17.2-py3-none-any.whl.metadata (2.6 kB)
Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich)
  Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)
Downloading rich-13.7.1-py3-none-any.whl (240 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 240.7/240.7 kB 866.3 kB/s eta 0:00:00
Downloading markdown_it_py-3.0.0-py3-none-any.whl (87 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 87.5/87.5 kB 1.6 MB/s eta 0:00:00
Downloading pygments-2.17.2-py3-none-any.whl (1.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 2.0 MB/s eta 0:00:00
Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Installing collected packages: pygments, mdurl, markdown-it-py, rich
Successfully installed markdown-it-py-3.0.0 mdurl-0.1.2 pygments-2.17.2 rich-13.7.1

用 dir() 檢視模組內容 :

>>> dir(rich)    
['Any', 'Callable', 'IO', 'Optional', 'TYPE_CHECKING', 'Union', '_IMPORT_CWD', '__all__', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_cell_widths', '_console', '_emoji_codes', '_emoji_replace', '_export_format', '_extension', '_fileno', '_log_render', '_loop', '_null_file', '_palettes', '_pick', '_ratio', '_win32_console', '_windows', '_windows_renderer', '_wrap', 'abc', 'align', 'ansi', 'box', 'cells', 'color', 'color_triplet', 'console', 'constrain', 'containers', 'control', 'default_styles', 'emoji', 'errors', 'get_console', 'highlighter', 'inspect', 'jupyter', 'load_ipython_extension', 'markup', 'measure', 'os', 'padding', 'pager', 'palette', 'panel', 'pretty', 'print', 'print_json', 'protocol', 'reconfigure', 'region', 'repr', 'scope', 'screen', 'segment', 'style', 'styled', 'table', 'terminal_theme', 'text', 'theme', 'themes']

用下列自訂模組來檢視其類別與函式等成員 : 

def list_members(parent_obj):
    members=dir(parent_obj)
    parent_obj_name=?????     
    for mbr in members:
        child_obj=eval(parent_obj_name + '.' + mbr) 
        if not mbr.startswith('_'):
          print(mbr, type(child_obj))    

將此函式存成 members.py 模組, 放在目前供作目錄下, 然後匯入其 list_members() 函式來檢視 technews 套件 : 

>>> from members import list_members   
>>> list_members(rich)   
Any <class 'typing._SpecialForm'>
Callable <class 'typing._CallableType'>
IO <class 'type'>
Optional <class 'typing._SpecialForm'>
TYPE_CHECKING <class 'bool'>
Union <class 'typing._SpecialForm'>
abc <class 'module'>
align <class 'module'>
ansi <class 'module'>
box <class 'module'>
cells <class 'module'>
color <class 'module'>
color_triplet <class 'module'>
console <class 'module'>
constrain <class 'module'>
containers <class 'module'>
control <class 'module'>
default_styles <class 'module'>
emoji <class 'module'>
errors <class 'module'>
get_console <class 'function'>
highlighter <class 'module'>
inspect <class 'function'>
jupyter <class 'module'>
load_ipython_extension <class 'function'>
markup <class 'module'>
measure <class 'module'>
os <class 'module'>
padding <class 'module'>
pager <class 'module'>
palette <class 'module'>
panel <class 'module'>
pretty <class 'module'>
print <class 'function'>
print_json <class 'function'>
protocol <class 'module'>
reconfigure <class 'function'>
region <class 'module'>
repr <class 'module'>
scope <class 'module'>
screen <class 'module'>
segment <class 'module'>
style <class 'module'>
styled <class 'module'>
table <class 'module'>
terminal_theme <class 'module'>
text <class 'module'>
theme <class 'module'>
themes <class 'module'>

可見 rich 套件提供了豐富的功能, 其中 print() 函式最常被用來輸出結構化資料. 

參考 :



二. 列印結構化資料 :    

Python 的資料結構例如字典, 集合, 與串列等, 如果使用內建的 print() 列印會以字元串方式顯示, 這樣就不容易看出其結構, 例如下面這個較複雜的字典物件 : 

>>> campaign={  
    "發起人": "小昭",
    "名稱": "喵星人大集合",
    "日期": "2024-03-20",
    "時間": "08:00:00",
    "地點": "夢想公園",
    "粉絲團": ["@愛貓圈", "@鏟屎官俱樂部"]
    } 

用 print() 列印時會輸出一個長字串, 可讀性較差 :

>>> print(campaign)   
{'發起人': '小昭', '名稱': '喵星人大集合', '日期': '2024-03-20', '時間': '08:00:00', '地點': '夢想公園', '粉絲團': ['@愛貓圈', '@鏟屎官俱樂部']}

如果使用 rich.print() 則會以鍵值結構顯示, 可讀性變高 : 

>>> import rich   
>>> rich.print(campaign)   
{
    '發起人': '小昭',
    '名稱': '喵星人大集合',
    '日期': '2024-03-20',
    '時間': '08:00:00',
    '地點': '夢想公園',
    '粉絲團': ['@愛貓圈', '@鏟屎官俱樂部']
}

官網教學文件建議也可以先建立 Console 物件, 然後呼叫其 print() 方法輸出 :

>>> from rich.console import Console   
>>> console=Console()   
>>> console.print(campaign)   
{
    '發起人': '小昭',
    '名稱': '喵星人大集合',
    '日期': '2024-03-20',
    '時間': '08:00:00',
    '地點': '夢想公園',
    '粉絲團': ['@愛貓圈', '@鏟屎官俱樂部']
}


三. 在命令提示字元視窗列印彩色文字 :    

Rich 套件還可以在命令列顯示彩色文字, 參考下面這篇網路教學文件 :


>>> from rich.console import Console  
>>> console=Console() 
>>> for color in ['red', 'blue', 'green', 'yellow', 'white', 'black', 'magenta', 'cyan']:  
...     console.print(f"Hello World! {color} bold", style=f"{color} bold")  
...     console.print(f"Hello World! {color}", style=f"{color}")  
...  

結果如下 :




沒有留言 :