是否有將終端格式化輸出打印到變量的方法?如何將終端格式化輸出打印到變量
print 'a\bb'
--> 'b'
我想這個字符串「B」給一個變量 - 所以怎麼辦呢?
我正在使用來自telnet的文本字符串。因此我想使用將要打印到屏幕的字符串。
所以我要尋找的是這樣的:
simplify_string('a\bb') ==> 'b'
以回車又如:
simplify_string('aaaaaaa\rbb') ==> 'bbaaaaa'
是否有將終端格式化輸出打印到變量的方法?如何將終端格式化輸出打印到變量
print 'a\bb'
--> 'b'
我想這個字符串「B」給一個變量 - 所以怎麼辦呢?
我正在使用來自telnet的文本字符串。因此我想使用將要打印到屏幕的字符串。
所以我要尋找的是這樣的:
simplify_string('a\bb') ==> 'b'
以回車又如:
simplify_string('aaaaaaa\rbb') ==> 'bbaaaaa'
這被證明是相當棘手,因爲有很多終端格式化命令(包括例如光標上/下/左/右命令,終端顏色代碼,垂直和水平標籤等)。
所以,如果你想正確模擬一個終端,得到一個終端模擬器! pyte
(pip install pyte
)實現了VT102兼容的內存虛擬終端。所以,你可以給它一些文字,然後從它那裏得到格式化文本:
import pyte
screen = pyte.Screen(80, 24)
stream = pyte.ByteStream()
stream.attach(screen)
stream.feed('xyzzz\by\rfoo')
print ''.join(c.data for c in screen[0]).rstrip()
# prints foozy
要處理多個行,剛剛加入所有行的文本(例如'\n'.join(''.join(c.data for c in row).rstrip() for row in screen).rstrip('\n')
)。
請注意,這不處理尾隨空格,但無論如何,這些在真正的終端上無法區分。
對於每個發佈方法來捕獲標準輸出的人來說:你錯過了這一點。這個問題正在簡化一個字符串來解釋*終端控制字符*,而不僅僅是捕獲'sys.stdout'。 – nneonneo
@nneonneo:捕捉標準輸出不會控制這些字符的例子是什麼? –
@DavidRobinson:每一種情況。他希望'\ b'實際上**刪除前一個字符**,有效地模擬'\ b'的行爲,因爲它會影響實際的終端。捕獲sys.stdout不會模擬終端,它只是直接捕獲任何和所有的控制序列。 – nneonneo