📖

pythonでコンソール表示に色をつけたり書き換えたりする

2024/11/04に公開

何気なく使っているprintやpprintですが、これらはコンソール画面で時系列に流れていってしまうため、見づらいときがあります。

コンソールに色をつけたり書き換えたりすることで、格段に見やすくなります

$ python -V
python3.12.7

pythonでカーソルを操作する

コンソール画面で、Enterキーや矢印キーを押すとカーソル位置を移動させることができますが、pythonからでもこれを実行できます。

やり方としては、sys.stdout.write()を用いて、引数にANSIエクケープシーケンスを入れます。

import sys

# カーソルをひとつ上に移動
sys.stdout.write('\033[1A')

よく使うANSIエスケープシーケンス

カーソルを指定方向にN個移動: \033[{N}A

Aは上、Bは下、Cは右、Dは左
例: \033[2A はカーソルを2行上に移動します。

カーソルを指定位置に移動: \033[{row};{col}H

例: \033[5;10H はカーソルを5行目・10列目に移動します。

行全体をクリア: \033[2K

現在の行をすべてクリアし、カーソルの位置はそのままです。

カーソルを行の先頭に移動: \033[G

現在の行の先頭にカーソルを移動します。

文字に色をつける

ANSIエスケープシークエンスで色をつける方法もありますが、termcolorというライブラリを使ったほうが読みやすく書けます

from termcolor import cprint

cprint('test', 'cyan', end='') #endは標準では'\n'で改行される。''を指定すると改行されない

実例

import os
import sys
import time
from datetime import datetime

from termcolor import cprint

if __name__ == '__main__':
    # 開始前にコンソール画面をクリアにする。windowsの場合は'cls'
    os.system('clear')

    # 初回の出力
    cprint('test1', 'green')  # 最初の行に表示
    cprint(datetime.now().strftime("%H:%M:%S"), 'red')  # 現在時刻を2行目に表示
    cprint('test2', 'green')  # 最後の行に表示

    # カーソルを2行目1列目に持ってくる
    sys.stdout.write('\033[2;1H)')  # 1行上(現在時刻の行)にカーソルを移動

    for i in range(10):
        current_time = datetime.now()
        h,m,s = [current_time.hour, current_time.minute, current_time.second]

        # カーソルを2行目1列目に持っていたあと、その行をクリア
        sys.stdout.write('\033[G\033[2K')  # 1行上(現在時刻の行)にカーソルを移動してクリア

        # 現在時刻の更新
        cprint(f'{h}:{m}:{s}', 'red', end='')  # 同じ位置に現在時刻を上書き

        # 標準出力のフラッシュ
        sys.stdout.flush()
        
        time.sleep(0.5)

    # 終了後にカーソルを一番下に持ってきて、改行
    sys.stdout.write('\033[1B\n')

Discussion