Pythonスクリプトの実行結果をターミナルに表示する際、ログレベル(エラー、警告、成功)に応じて色分けをすると、視認性が大幅に向上します。
print() 関数の出力を色付けするには、主に2つの方法があります。
- ANSIエスケープシーケンスを直接文字列に埋め込む
Coloramaなどの専用ライブラリを使用する
この記事では、これら2つの方法について解説します。
ANSIエスケープシーケンスの直接使用
多くのターミナルエミュレータ(LinuxやmacOSのターミナル、WindowsのWSLやWindows Terminalなど)は、ANSIエスケープシーケンスと呼ばれる特殊な制御コードをサポートしています。
これは \033[ (\x1b[ とも書きます)で始まる文字列で、その後に続くコードによって文字色、背景色、スタイル(太字など)を指定します。
基本的な使い方
色やスタイルを変更したい文字列の前に制御コードを挿入し、表示を元に戻したい場所で「リセットコード」(\033[0m) を挿入します。
# ANSIエスケープシーケンスを定数として定義
class TermColors:
# --- 文字色 ---
RED = '\033[31m'
GREEN = '\033[32m'
YELLOW = '\033[33m'
BLUE = '\033[34m'
# --- スタイル ---
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
# --- リセット ---
RESET = '\033[0m' # 全てのリセット
# f-string を使った出力例
print(f"{TermColors.GREEN}処理成功:{TermColors.RESET} ファイル 'data.csv' は正常に処理されました。")
print(f"{TermColors.YELLOW}{TermColors.BOLD}警告:{TermColors.RESET} 設定ファイルが見つかりません。デフォルト値を使用します。")
print(f"{TermColors.RED}エラー:{TermColors.RESET} データベース接続に失敗しました。")
print(f"{TermColors.BLUE}{TermColors.UNDERLINE}参照URL:{TermColors.RESET} http://example.com/docs")
主な制御コード
以下は、よく使われるANSIエスケープシーケンスのコード一覧です。
| コード | 意味 | コード | 意味 |
\033[30m | 黒(文字) | \033[40m | 黒(背景) |
\033[31m | 赤(文字) | \033[41m | 赤(背景) |
\033[32m | 緑(文字) | \033[42m | 緑(背景) |
\033[33m | 黄(文字) | \033[43m | 黄(背景) |
\033[34m | 青(文字) | \033[44m | 青(背景) |
\033[35m | マゼンタ(文字) | \033[45m | マゼンタ(背景) |
\033[36m | シアン(文字) | \033[46m | シアン(背景) |
\033[37m | 白(文字) | \033[47m | 白(背景) |
| コード | 意味 |
\033[1m | 太字(または高輝度) |
\033[4m | <u>下線</u>(アンダーライン) |
\033[7m | 色反転(文字色と背景色) |
\033[0m | すべての装飾をリセット |
注意点: この方法は、環境(OSや使用するターミナル)に依存します。特にWindowsの古いコマンドプロンプト(cmd.exe)では、そのままでは動作しない場合があります。
Coloramaライブラリの使用(推奨)
OS間の互換性を考慮し、より安定して色付けを行うためには、Coloramaのようなサードパーティライブラリの使用が推奨されます。
Colorama は、Windows環境でもANSIエスケープシーケンスが機能するように内部で処理をラップしてくれるため、クロスプラットフォームで同じコードを使用できます。
1. インストール
まず、pipを使用して Colorama をインストールします。
pip install colorama
2. Colorama の使い方
colorama を使用するには、スクリプトの最初に init() を呼び出す必要があります。
Fore(文字色)、Back(背景色)、Style(スタイル)を使用して色を指定します。
from colorama import init, Fore, Back, Style
# Windows環境でANSIシーケンスを有効にするために init() を呼び出す
# autoreset=True にすると、print() の呼び出し後に自動でスタイルがリセットされる
init(autoreset=True)
# Fore (文字色)
print(Fore.CYAN + "システム情報を表示します。")
print(Fore.RED + "致命的なエラーが発生しました。")
# Back (背景色)
print(Back.YELLOW + Fore.BLACK + " 注意: メンテナンスが予定されています。 ")
# Style (スタイル)
print(Style.BRIGHT + Fore.GREEN + "接続テストに成功しました。")
# autoreset=False (デフォルト) の場合は、手動でリセットが必要
init(autoreset=False)
print(Fore.MAGENTA + "このテキストはマゼンタです。")
print("このテキストはマゼンタのままです。")
print(Style.RESET_ALL + "ここでリセットしました。")
Colorama を使うことで、環境の違いを意識することなく、print() の出力に色を付けることができます。
まとめ
ターミナル出力の色付けは、スクリプトの可読性を高めるのに役立ちます。
- ANSIエスケープシーケンス:
- ライブラリ不要で手軽に実装できます。
\033[31m(赤)のように指定し、\033[0mでリセットします。- 環境によっては動作しない場合があります。
Coloramaライブラリ:pip install coloramaで導入できます。init()を呼び出すことで、Windowsを含むクロスプラットフォームで動作します。Fore.REDやStyle.BRIGHTのように、より直感的に指定できます。
配布するアプリケーションや、Windowsでの動作を保証する必要がある場合は Colorama の使用を、Linux/macOS環境のみを対象とした個人用スクリプトであれば手軽なANSIシーケンスを、といった使い分けが考えられます。
