簡體   English   中英

如何讓 python 解釋從文本文件讀取的字符串中 colors 的 ANSI 轉義碼

[英]How do I get python to interpret the ANSI escape codes for colors in a string read from a text file

我嘗試過的所有代碼都可以在 VS Code 終端和 Widows 終端(電源腳本和命令窗口)中運行,所以我對此感到非常高興,但是,當我從文本文件中讀取字符串並打印字符串時,轉義碼以普通視圖打印,並且沒有顏色應用於字符串。

我已經嘗試過八進制、十六進制和 unicode 版本,我遇到了與“\n”相同的問題,直到我意識到讀取的字符串將包含“\n”,它會有效地轉義“”字符,所以調用.replace字符串上的 ("\\n","\n") 解決了這個問題,但我對顏色代碼並不滿意。

這是我用來讀取文件的代碼:

with open('ascii_art_with_color.txt','r') as file: 
    for line in file.readlines() :
        text_line = line
        print( text_line , end='' )

來自 ascii 文件的示例:

encounter = You \033[31mencounter\033[0m a wolf howling at the moonlight

使用 print function 打印效果很好,無論是字符串常量還是來自變量

print('The wolf \033[31mgrowls\033[0m at you as you try to get closer')

winning = 'The wolf lets out a \033[34mpiercing\033[0m cry, then falls to the ground'
print(winning)

想法? 讓我難過的主要問題是代碼沒有被解釋/應用於我從文本文件中讀取的字符串,其他任何東西似乎都有效。

更新:

正如評論中所建議的那樣,該文件包含“\033”(4 個字符)而不是“\033”一個字符。 我希望 python 會占用這條線,然后在打印時將其應用/翻譯/編碼為 ANSI 轉義序列代碼,就像上面示例中的字符串一樣。

與此同時,我設法使用用轉義序列替換特定字符串的腳本來獲取文本文件中的顏色(我猜 python 在將其寫入文件之前在幕后進行編碼)

file_dest = 'ascii_monster_wolf_dest.txt'
with open(file_name,'r') as file, open(file_dest,'w+') as file_dest:
    for line in file.readlines():
        line = line.replace('{@}','\033[31m')
        line = line.replace('{*}','\033[0m')
        file_dest.writelines(line)

這是一些進步,但不是我真正想要的。

回到我的問題,有沒有辦法讀取文件並將序列 '\033'(4 個字符)解釋為 1 字符轉義序列,這似乎與字符串一樣?

有幾種方法可以按照您的要求進行操作。

如果您用引號將各個行括起來,使它們看起來像 Python 字符串常量,您可以使用 ast 文字評估器對其進行解碼:

s = '"\\x61\\x62"'
# That string has 10 characters.
print( ast.literal_eval(s) )
# Prints  ab

或者,您可以將字符串轉換為字節字符串,並使用“unicode-escape”編解碼器:

s = '\\x61\\x62'
s = s.encode('utf-8').decode('unicode-escape')
print( s )
# Prints   ab

然而,以我的拙見,使用其他類型的標記來表示您的 colors 會更好。 我的意思是這樣的:

<red>This is red</red>  <blue>This is blue</blue

也許不完全是 HTML 類型的語法,而是帶有您理解的代碼標記的東西,可以被人類閱讀,並且可以被所有語言解釋。

以二進制格式打開文件。 然后按照 Tim Roberts 的建議使用 decode() 。

with open('ascii_art_with_color.txt','rb') as file: 
    for line in file.readlines() :
        print( line.decode('unicode-escape') , end='' )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM