在Python中使用colorama庫給輸出添加顏色
小張最近遇到一件不大不小的事。他寫了一個簡單的登錄測試腳本,用來幫同事驗(yàn)證一批用戶的賬號密碼是否可用。腳本跑起來很快,刷刷刷一行行結(jié)果往外蹦,“成功”“失敗”“成功”“失敗”……幾十行看下來,他根本看不清哪些失敗了。每次都要在長長的輸出里一行行找“失敗”兩個字。
同事建議他試試colorama這個庫。能讓成功顯示成綠色,失敗顯示成紅色,一眼就能看出來問題出在哪。
colorama是誰?為什么需要它?
colorama是一個極其簡單的Python第三方庫,核心就干一件事:讓你的命令行打印出彩色的字。它不需要依賴任何別的庫,裝上去就能用。
“命令行這不一直支持顏色嗎?”你可能會問。問題沒這么簡單。
Linux和Mac的終端天生支持顏色,直接在字符串里加幾個特殊轉(zhuǎn)義符就行。但在Windows的命令提示符和舊版PowerShell里,你不做點(diǎn)什么,這些轉(zhuǎn)義字符直接原樣輸出給你看——屏幕上出現(xiàn)一堆像\033[31msome red text這樣亂七八糟的東西,而不是紅色的文字。
colorama的價值就在這里。它幫你自動識別你用的是什么系統(tǒng)。Windows用戶調(diào)用一下初始化,colorama會自動把顏色代碼轉(zhuǎn)換成合適的Win32 API調(diào)用;你代碼不用動,在Linux、Mac和Windows上都能正常顯示顏色。你只用寫一套代碼,到處都能跑出漂亮的效果。
安裝它,只需要一行:
pip install colorama
跨平臺的兼容性,colorama支持的Python版本也覆蓋得很全:3.9、3.10、3.11、3.12、3.13,還有PyPy 3.11都在支持范圍內(nèi)。版本0.4.6之后對Python 3.12的兼容性也都完善了。
最簡單的用法:Fore, Back, Style
colorama提供了三個核心類:
- Fore:控制文字的顏色
- Back:控制文字的背景色
- Style:控制文字的樣式(加粗、變暗、高亮等)
舉個最簡單的例子,你要打印一個字“小紅”,讓他顯示成紅色的:
from colorama import init, Fore, Back, Style init() print(Fore.RED + "hello, red world") print(Back.GREEN + "這是綠色的背景") print(Style.BRIGHT + "這是高亮/加粗的文字")
這里可以看到一個小細(xì)節(jié),Fore.RED、Back.GREEN這些常量本質(zhì)上是一些“控制代碼”的包裝。把它們和普通字符串用+拼接在一起,然后再傳給print()去打印,終端遇到這些代碼時就知道“紅色文字從這里開始”。但所有顏色常量都要用英文大寫來寫。
顏色做完別忘了關(guān)燈:你可能會踩的坑
你可能會想當(dāng)然地以為,上面印完Fore.RED + "hello"之后,再打一句print("world")會自動恢復(fù)默認(rèn)。但現(xiàn)實(shí)是很無情的。如果你直接敲進(jìn)命令行,你會發(fā)現(xiàn)后面的文字依然是紅色的。因?yàn)樵诮K端看來,cmd.exe不是聰明人,你不說停止它就永遠(yuǎn)保持幫你設(shè)的那個顏色參數(shù)。
print(Fore.RED + "這段話是紅色的")
print("這段話也偷偷變成奇怪的顏色了??")第二個print會繼承上一個print設(shè)置的狀態(tài),輸出也是紅色的。你可能會覺得這樣還行,用紅色記錄警告,但下一條可讀性就很差了。更麻煩的是,你正在編寫的復(fù)雜項(xiàng)目中可能會不小心讓異常報錯也跟著變成全紅,大大降低代碼查閱的愉悅感。這時候你需要做一件事:強(qiáng)制把顏色恢復(fù)回來。
手動重置顏色的方式是:
print(Fore.RED + "紅色的文字" + Fore.RESET)
print("現(xiàn)在恢復(fù)正常顏色了")不過這只重置了前景的顏色,背景色和亮度風(fēng)格還沒回去,保險一些的完全重置要靠Style.RESET_ALL。
但代碼里到處加+ Style.RESET_ALL很累人。更省力的辦法用到init(autoreset=True):
from colorama import init, Fore
init(autoreset=True)
print(Fore.RED + "紅色的文字")
print("自動恢復(fù)默認(rèn)顏色,不用操心")設(shè)置里autoreset=True意味著每行內(nèi)所有顏色變化在call最后一步時都會自動執(zhí)行重置命令,不干擾后面的代碼。
實(shí)戰(zhàn)例子:讓登錄日志“一目了然”
回到小張的登錄測試腳本。原來的版本是這樣的:
results = [
("user1", "登錄成功"),
("user2", "登錄失敗 - 密碼錯誤"),
("user3", "登錄成功"),
("user4", "登錄成功"),
("user5", "登錄失敗 - 賬戶鎖定"),
]
for user, status in results:
print(f"{user}: {status}")在色彩的世界里,我們可以改寫東西:
from colorama import init, Fore
init(autoreset=True)
for user, status in results:
if "成功" in status:
color = Fore.GREEN
else:
color = Fore.RED
print(f"{user}: {color}{status}")這么一改,輸出調(diào)試瞬間一目了然。init(autoreset=True)確保每個print內(nèi)部的顏色設(shè)定不會影響到下一行,后方的不同行不會意外變色了。
假如一段log同時用到前景、背景和高亮加粗,可以組合顏色樣式可以:
print(Fore.YELLOW + Back.BLUE + Style.BRIGHT + "關(guān)鍵日志" + Style.RESET_ALL)
print("后續(xù)執(zhí)行指令恢復(fù)了")這種組合可以產(chǎn)生醒目的提醒旗幟,讓系統(tǒng)日志在復(fù)雜調(diào)試?yán)镆荒苛巳弧?/p>
從頭到腳說完整個顏色表
colorama支持的全部顏色在這里:
- 紅色、綠色、黃色、藍(lán)色
- 洋紅色(MAGENTA)、青色(CYAN)、白色、黑色
- 保留預(yù)設(shè)的顏色變淡的DEFAULT(還原回系統(tǒng)默認(rèn))
前景色(Fore): Fore.RED, Fore.GREEN, Fore.YELLOW, Fore.BLUE, Fore.MAGENTA, Fore.CYAN, Fore.WHITE, Fore.BLACK 背景色(Back): 對應(yīng)紅/綠/黃/藍(lán)/洋紅/青/白/黑等8種顏色 文字樣式(Style): Style.DIM(變暗), Style.NORMAL(常規(guī)), Style.BRIGHT(高亮/加粗)
大部分普通應(yīng)用只需要這三種,8種顏色已經(jīng)足夠滿足八成場景的需求。
進(jìn)階技巧:高亮特定單詞
你也可能只想把句子里的某個關(guān)鍵單詞特殊標(biāo)記。比如一行錯誤日志,只把“ERROR”涂紅,其余文字保持默認(rèn)。
實(shí)現(xiàn)這種局部著色有很多手段。假定有一個固定詞需要高亮,可以用replace()把目標(biāo)詞包上顏色控制符:
from colorama import init, Fore
init(autoreset=True)
def highlight_word(text, word, color):
colored_word = color + word + Fore.RESET
return text.replace(word, colored_word)
log = "ERROR: Here comes some problem about file path"
print(highlight_word(log, "ERROR", Fore.RED))這樣實(shí)現(xiàn)起來代碼干凈,也好維護(hù)。
使用colorama沒有正確初始化?兩種通用做法
前面提到終端的彩色打印需要調(diào)用init()。關(guān)于初始化的調(diào)用方式,有兩個主流用法:
init(autoreset=True):適合不想手動多次Reset的情況,每次顏色都會有效分隔開;init(convert=True, autoreset=True):顯式打開ANSI轉(zhuǎn)Win32轉(zhuǎn)換,對某些老舊Windows環(huán)境更可靠。
其實(shí)在較新的colorama 0.4.6版本中,init()會自動檢測系統(tǒng)環(huán)境,在大部分情況下直接init(autoreset=True)就夠用了。
但在公司復(fù)雜的內(nèi)部環(huán)境(非標(biāo)準(zhǔn)IDE的嵌入式終端)或者服務(wù)器集群測試情況下,有時色彩依然出不來的癥狀,可以試試一個更健壯的初始化方法——使用just_fix_windows_console()函數(shù),專門解決Windows終端顏色穿透問題。這個函數(shù)比舊版的init()更可靠。
一個漂亮的控制臺進(jìn)度條
命令行工具繞不開的一個功能就是進(jìn)度條。一個傳統(tǒng)的進(jìn)度條往往蒼白無趣,但配合colorama,你可以把進(jìn)度條打扮得專業(yè)又不刺眼:
import time
from colorama import init, Fore, Style
init(autoreset=True)
def colored_progress_bar(percent):
bar_length = 50
filled = int(bar_length * percent)
if percent < 0.3:
bar_color = Fore.RED
elif percent < 0.7:
bar_color = Fore.YELLOW
else:
bar_color = Fore.GREEN
bar = '█' * filled + '-' * (bar_length - filled)
print(f"\r進(jìn)度:[{bar_color}{bar}{Style.RESET_ALL}] {percent*100:.1f}%", end="", flush=True)
for i in range(101):
colored_progress_bar(i/100)
time.sleep(0.05)
print()如果制作更復(fù)雜的色彩主題,還可以通過Python的類封裝來統(tǒng)一管理。
高級整合:Colorama不要單打獨(dú)斗
有的項(xiàng)目打印內(nèi)容復(fù)雜、組合靈活,想要各種前置方便切換時可能會想:如果每一個print前面都要加Fore.RED、Back.CYAN、Style.BRIGHT這么多代碼,好復(fù)雜。其實(shí)完全可以colorama和termcolor一起工作。先初始化colorama讓它保障跨平臺轉(zhuǎn)換,再用termcolor.colored()簡化色彩定義:
from colorama import init
init()
from termcolor import colored
print(colored('出錯了!', 'red', 'on_white', attrs=['reverse']))簡簡單單。colorama像是一個翻譯器,專門負(fù)責(zé)在Windows系統(tǒng)內(nèi)消化Windows看不懂的ANSI指令。高級樣式包裝可以按組合招來,為彩色文本帶來動態(tài)視覺感。
當(dāng)顏色真的出不來了:快速排查指南
可能在某個環(huán)境下你的代碼意外輸出了[31m文字,而不是彩色內(nèi)容。直接排查思路:
- **檢查是否調(diào)用了init()**:
init(autoreset=True)這一行得寫在所有打印顏色之前 - 升級colorama:有些環(huán)境太舊的話用
pip install --upgrade colorama解決 - 手動檢測終端交互的限制:在某些純文本重定向場景,顏色代碼會被系統(tǒng)扔掉。用
sys.stdout.isatty()檢測當(dāng)前是否終端環(huán)境 - 確認(rèn)不是特殊IDE限制:有的IDE集成了對ANSI支持的設(shè)置需要手動開啟
- 用直接方法驗(yàn)證兼容性:試運(yùn)行非常簡單的
print(Fore.RED + "測試" + Style.RESET_ALL),看終端支不支持 - 跨平臺注意:某些Windows的PowerShell 5.1等舊版本需要用戶手動啟用ANSI支持
- 換兼容的現(xiàn)代終端:如果是Windows建議使用
Windows Terminal、Visual Studio Code的內(nèi)建終端,它們對ANSI原生支持的認(rèn)可度極高。
代碼入庫的適用場合
colorama就像你的老朋友一樣小巧玲瓏。推薦它用在簡單腳本里、監(jiān)控日志明顯標(biāo)記時,任何需要從大量輸出里快速提取關(guān)鍵信息的地方都值得用起來。簡潔的管理方法,明確的自定義顏色方案,讓測試和調(diào)試事半功倍。追求更高級效果——例如渲染表格、實(shí)時進(jìn)度條、終端圖表——可以嘗試rich這種豐富庫,但在大部分彩色場景和跨平臺潤色上,我還是愿意選干干凈凈的colorama。
本質(zhì)上colorama的核心理念是:讓色彩不干擾你的邏輯,而你的邏輯不再被無色彩的“失敗的搜索”淹沒在沉默里。給字符串加點(diǎn)顏色是小事,但正是這些小事的積累,讓終端上的交互和問題追蹤變得直觀而優(yōu)雅。
小張搞明白了以后,跑去跟領(lǐng)導(dǎo)演示新版本的登錄測試腳本運(yùn)行結(jié)果。紅色的“失敗”大老遠(yuǎn)就能看到,綠色的“成功”如同一串綠燈順利跑完。領(lǐng)導(dǎo)說了一個字:好。
以上就是在Python中使用colorama庫給輸出添加顏色的詳細(xì)內(nèi)容,更多關(guān)于Python colorama輸出添加顏色的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
TensorFlow神經(jīng)網(wǎng)絡(luò)構(gòu)造線性回歸模型示例教程
這篇文章主要為大家介紹了TensorFlow構(gòu)造線性回歸模型示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
python進(jìn)階學(xué)習(xí)實(shí)時目標(biāo)跟蹤示例詳解
這篇文章主要為大家介紹了python進(jìn)階學(xué)習(xí)實(shí)時目標(biāo)跟蹤示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
PyQt5使用QTimer實(shí)現(xiàn)電子時鐘
這篇文章主要為大家詳細(xì)介紹了PyQt5使用QTimer實(shí)現(xiàn)電子時鐘,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
Python實(shí)現(xiàn)網(wǎng)絡(luò)自動化eNSP
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)絡(luò)自動化eNSP,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

