首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让python解释从文本文件读取的字符串中的ANSI转义代码

如何让python解释从文本文件读取的字符串中的ANSI转义代码
EN

Stack Overflow用户
提问于 2022-03-08 21:26:55
回答 2查看 1.3K关注 0票数 0

我尝试过的所有代码都在VS代码终端和Widow终端(Power Script和Command窗口)中工作,因此我对此非常高兴,但是,当我从文本文件中读取字符串并打印字符串时,转义代码将在普通视图中打印,并且不会对字符串应用颜色。

我尝试过八进制、十六进制和unicode的版本,直到我意识到字符串读取中会包含"\n",所以在字符串上调用.replace( "\n“,"\n")就解决了这个问题,直到我意识到字符串的读取将包含”\n“,所以调用了(”\n“,”\n“)解决了这个问题,我也遇到了同样的问题。

这是我用来读取文件的代码:

代码语言:javascript
运行
复制
with open('ascii_art_with_color.txt','r') as file: 
    for line in file.readlines() :
        text_line = line
        print( text_line , end='' )

来自ascii文件的示例:

代码语言:javascript
运行
复制
encounter = You \033[31mencounter\033[0m a wolf howling at the moonlight

使用print函数进行打印很好,无论是字符串常量还是变量。

代码语言:javascript
运行
复制
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在将其写入文件之前在幕后进行编码)。

代码语言:javascript
运行
复制
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字符转义序列,就像它处理字符串的方式一样?

EN

回答 2

Stack Overflow用户

发布于 2022-03-09 19:17:37

有几种方法可以满足你的要求。

如果用引号包装单个行,使它们看起来像Python字符串常量,则可以使用ast文字计算器对其进行解码:

代码语言:javascript
运行
复制
s = '"\\x61\\x62"'
# That string has 10 characters.
print( ast.literal_eval(s) )
# Prints  ab

或者,您可以将字符串转换为字节字符串,并使用“unicode-转义”编解码器:

代码语言:javascript
运行
复制
s = '\\x61\\x62'
s = s.encode('utf-8').decode('unicode-escape')
print( s )
# Prints   ab

然而,在我看来,使用其他类型的标记来表示您的颜色会更好。我的意思是:

代码语言:javascript
运行
复制
<red>This is red</red>  <blue>This is blue</blue

也许不是一种HTML类型的语法,而是一些你能理解的代码标记,可以被人类阅读,也可以被所有的语言解释。

票数 1
EN

Stack Overflow用户

发布于 2022-09-07 09:09:46

以二进制格式打开文件。然后按照Tim的建议使用decode()。

代码语言:javascript
运行
复制
with open('ascii_art_with_color.txt','rb') as file: 
    for line in file.readlines() :
        print( line.decode('unicode-escape') , end='' )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71401636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档