HOWTO · Python

Python の出力色付きテキスト

この記事では、Python で色付きのテキストを出力する方法を説明します。

このページの内容

このガイドでは、Pythonでターミナルに色付きテキストを出力する方法を説明します。print() は出力ストリームにテキストを書き込みます。そのテキストに埋め込まれた ANSI エスケープシーケンスは、対応するターミナルに書式の変更を要求します。ターミナルではそれらのシーケンスが色として表示されることがありますが、ログファイルやIDEのペインなど、ほかの出力先ではコードがそのまま表示される場合があります。背景色やその他のターミナル制御については、ANSIエスケープコードとPythonの色のガイドを参照してください。

ターミナルの色コードの仕組み

ANSI カラーシーケンスはエスケープ文字(\033)で始まり、文字色、背景色、またはスタイルを選ぶ数値パラメーターを含みます。たとえば、\033[31m は文字色を赤にするよう要求し、\033[0m はリセットを要求します。これらの制御文字を解釈するのはターミナルであり、Python自体が文字列に色を付けるわけではありません。対応状況はターミナルや出力先によって異なるため、すべてのコンソールやリダイレクト先のファイルで色付きテキストが表示されるとは限りません。

メッセージを出力した後もターミナルの書式設定が有効なままになることがあるため、リセットが重要です。色を付けた各部分の末尾でリセットすれば、同じターミナルセッションで後に出力するテキストへ書式が引き継がれるのを防げます。

ANSIエスケープコードで色付きテキストを出力する

シーケンスを再利用したり変更したりしやすいよう、名前付き定数を定義します。この自己完結した例では、3つのメッセージをそれぞれリセット付きで出力します。ここではコードを示すだけで、実行結果を示すものではありません。

次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。

class Colors:
    GREEN = "\033[92m"
    YELLOW = "\033[93m"
    RED = "\033[91m"
    RESET = "\033[0m"

print(Colors.GREEN + "File Saved Successfully!" + Colors.RESET)
print(Colors.YELLOW + "Warning: Are you sure you want to continue?" + Colors.RESET)
print(Colors.RED + "Unable to delete record." + Colors.RESET)

色を変更するには、色の定数を別の対応する ANSI シーケンスに置き換えます。シーケンスを文字列に直接記述したり、f文字列を使ったりすることもできます。これらは書式の選択肢であり、どのターミナルがシーケンスを解釈するかは変わりません。コードはコピーして編集できます。

Windowsでの互換性のためにColoramaを使う

ANSI が表示されるかどうかは、ターミナル環境によって異なります。Windowsでは、coloramaを使うと、ANSI シーケンスを出力するアプリケーションが、対応するコンソールで動作しやすくなる場合があります。ただし、動作はコンソールと出力先によって異なります。スクリプトを実行する環境に python -m pip install colorama(または python3 -m pip install colorama)でパッケージをインストールします。これらはPythonの文ではなく、シェルコマンドです。

次の完全な例では、オプションのパッケージがインストールされていない環境にも対応します。パッケージが利用できる場合はColoramaを初期化し、文字色と明るいスタイルを組み合わせます。この例はここでは実行していません。パッケージに依存する分岐を使うにはColoramaのインストールが必要です。
このセクションのコードと表示されるラベルや出力は英語のままです。

try:
    import colorama
    from colorama import Fore, Style
except ImportError:
    print("Install colorama with: python -m pip install colorama")
else:
    colorama.init()
    print(Fore.BLUE + Style.BRIGHT + "This is the color of the sky" + Style.RESET_ALL)
    print(Fore.GREEN + "This is the color of grass" + Style.RESET_ALL)
    print(Fore.BLUE + Style.DIM + "This is a dimmer version of the sky" + Style.RESET_ALL)
    print(Fore.YELLOW + "This is the color of the sun" + Style.RESET_ALL)

Coloramaでは、文字色の定数を Fore から、テキストスタイルを Style から利用できます。Style.RESET_ALL は有効な ANSI スタイルをリセットし、Fore.RESET は文字色をリセットします。実際の表示はターミナルによって異なります。

色とその他のターミナルスタイルをリセットする

ANSI シーケンスを直接使う場合は、色付きテキストの後に \033[0m などのリセットを追加します。この例では、そのシーケンスに名前付き定数 RESET を使い、各メッセージの書式設定を完結させています。リセットを省略すると、別のシーケンスで変更されるかターミナルがリセットするまで、後続の出力にも選択した色やスタイルが残ることがあります。

Coloramaでは、書式設定全体を既定の状態に戻す場合に Style.RESET_ALL を使います。Fore.RESET がリセットするのは文字色だけで、ほかの有効なスタイルすべてをリセットするわけではありません。変更した属性に合ったリセットを選び、書式を適用したいテキストの直後に置いてください。そうすれば、後続のメッセージやプロンプトに意図しないターミナルの書式が引き継がれるのを防げます。