如何将终端格式化输出打印到变量中

5
有没有一种方法可以将终端格式化输出打印到变量中?
print 'a\bb'
--> 'b'

我希望将字符串'b'赋值给一个变量,那么应该如何做呢?
我正在处理来自Telnet的文本字符串。因此,我想要使用将被打印到屏幕上的字符串进行操作。
所以我需要像这样的代码:
simplify_string('a\bb') ==> 'b'

另一个带有换行符的例子:

simplify_string('aaaaaaa\rbb') ==> 'bbaaaaa'

对于每个发布仅捕获标准输出方法的人:你们忽略了重点。问题在于简化字符串以考虑终端控制字符,而不仅仅是捕获sys.stdout。 - nneonneo
1
@nneonneo:有什么例子是捕获标准输出不会控制这些字符的吗? - David Robinson
1
@DavidRobinson: 每种情况都是如此。他希望 \b 实际上可以删除前一个字符,从而有效地模拟 \b 对实际终端的影响。捕获 sys.stdout 并不能模拟终端,它只是直接捕获所有控制序列。 - nneonneo
nneonneo 是正确的。我想把那些控制字符去掉,这样我就可以操作字符串并从中搜索东西等。 - mkorpela
1
已经有两个答案了,还剩多少?这才是我所称之为好问题的原因 ;) - BartoszKP
@BartoszKP:如果算上之前消失的那些,就有四个了... - nneonneo
1个回答

8
这个问题相当棘手,因为有许多终端格式化命令(包括光标上下/左右移动,终端颜色代码,垂直和水平制表符等)。
因此,如果您想正确模拟终端,请获取终端仿真器!pytepip install pyte)实现了一个VT102兼容的内存虚拟终端。因此,您可以向其提供一些文本,然后从中获取格式化的文本:
import pyte

screen = pyte.Screen(80, 24)
stream = pyte.ByteStream(screen)
stream.feed(b'xyzzz\by\rfoo')
# print the first line of text ('foozy')
print(screen.display[0].rstrip())

要处理多行文本,只需将所有行连接起来(例如'\n'.join(row.rstrip() for row in screen.display).rstrip())。

请注意,这并不处理尾随空格,但在实际终端上也无法区分这些空格。


刚刚在谷歌上搜索 Python 终端模拟器 :) 做得不错! - BartoszKP
Python3.6上出现了"'Screen' object does not support indexing"错误。 - Suresh Kota
在使用颜色代码时,有没有办法获取字符的颜色和样式? - rizerphe
@SureshKota已修复。@БогданОпир:是的,请参阅pyte文档中的Char。您可以使用screen.buffer来访问终端缓冲区中稀疏数组的Char;每个Char都包括颜色和样式。 - nneonneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接