• 欢迎访问佰阅部落,本站为优质开源程序分享站,所有自研项目均开源免费,可在Github查看源码。 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 欢迎积极参与讨论、反馈问题

Python本月热门项目:用rich库丰富和美化终端输出

Linux 佰阅部落 2周前 (06-23) 196次浏览
文章目录[隐藏]

如何美化python终端输出的json或dict格式呢?一般开发者们会选用pprint,或直接copy输出结果,在vscode或其他美化json的页面格式化一下,因为格式美化输出并不是刚需,仅仅是为了便于理解。一般仅在比较成熟的项目上,想要美化下的化,就可以使用这篇文章推荐的rich库了。

0.安装

项目地址:willmcgugan/rich

pip install rich

1.基本用法

from rich.console import Console
from rich.theme import Theme
custom_theme = Theme({
    "info" : "dim cyan",
    "warning": "magenta",
    "danger": "bold red"
})
console = Console(theme=custom_theme)
console.print("This is information", style="info")
console.print("Something terrible happened!", style="danger")
console.print("Google", style="link https://google.com")

2.其他用法

1.格式化json文本

2.表格输出


还有其他的,比如markdown输出等等。稍微参考下就可以上手,本站以下面的progress为例,实际演示下:

3. Progress制作下载进度条

效果图如下:


实现代码:

import os
from concurrent.futures import ThreadPoolExecutor
from typing import Iterable
from urllib.request import urlretrieve

from rich.progress import (
    BarColumn,
    DownloadColumn,
    TextColumn,
    TransferSpeedColumn,
    TimeRemainingColumn,
    Progress,
    TaskID,
)

progress = Progress(
    TextColumn("[bold blue]{task.fields[filename]}", justify="right"),
    BarColumn(bar_width=None),
    "[progress.percentage]{task.percentage:>3.1f}%",
    "•",
    DownloadColumn(),
    "•",
    TransferSpeedColumn(),
    "•",
    TimeRemainingColumn(),
)


class progress_bar():
    def __init__(self, task_id):
        self.task_id = task_id

    def __call__(self, block_num, block_size, total_size):
        progress.update(self.task_id, advance=1 * block_size, total=total_size)


def touch(fname, times=None):
    with open(fname, 'a'):
        os.utime(fname, times)


def copy_url(task_id: TaskID, url: str, path: str) -> None:
    """Copy data from a url to a local file."""
    urlretrieve(url, path, progress_bar(task_id))
    touch(path + ".done")


def download(urls: Iterable[str], dest_dir: str):
    """Download multuple files to the given directory."""
    with progress:
        with ThreadPoolExecutor(max_workers=4) as pool:
            for url in urls:
                filename = url.split("/")[-1]
                dest_path = os.path.join(dest_dir, filename)
                task_id = progress.add_task("download", filename=filename)
                pool.submit(copy_url, task_id, url, dest_path)

if __name__ == "__main__":
    urls = ["https://xxxx","https://xxxx"]  #此处为需要下载的资源列表,链接地址
    download(urls,"./")     #填入下载的资源列表,默认输出在当面目录

4. 小结

关于美化是否有必要?个人认为,如果不是最终商用输出,估计一辈子也不会用到此类工具。但是如果你想要输出带点色彩,那么这个rich库则是最佳选择,使用该库可以轻易做到美化的显示输出。那么,最为开发人员,你需要彩色吗?答案肯定是否!但是从小白或受众用户而言,添加这个则是锦上添花,很有必要。所以该库的使用也是非常矛盾的。顺便一提的是,jupyter的官方实验室没有把我打进jupyter的大门,微软的jupyter也没有,最终反而是谷歌的Colaboratory把我带进了jupyter。被谷歌提供的各种案例、机器学习给折服了。或许只有最终应用,才能凸显意义,否则就算有再好的工具,也没意义,而本篇的rich库就是这样,知道是好东西,只有广泛使用了才是你的。


佰阅部落 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python本月热门项目:用rich库丰富和美化终端输出
赞一下 (0)
佰阅部落
关于作者:
爱折腾,爱学习,用心分享各种实用搭建教程,让优质web程序脱颖而出,欢迎订阅!