Python:如何修改/编辑打印到屏幕的字符串并将其读回?

时间:2011-08-30 18:37:44

标签: python

我想在Windows中将字符串打印到命令行/终端,然后编辑/更改字符串并将其读回。谁知道怎么做?感谢

print "Hell"
Hello!  <---Edit it on the screen
s = raw_input()
print s
Hello!

4 个答案:

答案 0 :(得分:2)

你可以做一些ANSI技巧,使它看起来像你在屏幕上编辑。 Check out this link(也类似于this SO post on colors)。

这仅适用于某些终端和配置。因人而异。

这个python脚本在我的Win7上的Cygwin终端上运行:

print 'hell'
print '\033[1A\033[4CO!'

在一行上结束打印hellO!。第二次打印将光标向上移动一行(Esc [1A]然后超过4个字符(Esc [4C]),然后打印'O!'。

它不会让你读回来虽然......只有1/2答案。

答案 1 :(得分:0)

os.sys.stdout只能写入,但只要你没有写回车符,就可以用\b或整行\r删除最后一行的某些字符。

(但是,另请参阅my question有关标准python控制台/终端的限制)

我曾经做过一些输出练习(包括一个状态栏)来编写,删除或动画,如果你愿意,也许它是有帮助的:

from __future__ import print_function
import sys, time

# status generator
def range_with_status(total):
    n=0
    while n<total:
        done = '#'*(n+1)
        todo = '-'*(total-n-1)
        s = '<{0}>'.format(done+todo)
        if not todo:
            s+='\n'
        if n>0:
            s = '\r'+s
        sys.stdout.write(s)
        sys.stdout.flush()
        yield n
        n+=1

print ('doing something ...')
for i in range_with_status(10):
    time.sleep(0.1)

print('ready')
time.sleep(0.4)


print ('And now for something completely different ...')
time.sleep(0.5)
msg = 'I am going to erase this line from the console window.'
sys.stdout.write(msg); sys.stdout.flush()
time.sleep(1)
sys.stdout.write('\r' + ' '*len(msg))
sys.stdout.flush()
time.sleep(0.5)
print('\rdid I succeed?')  
time.sleep(4)

答案 2 :(得分:0)

raw_input接受“提示消息”的参数,因此使用它来输出消息,然后将其添加到您返回的内容中。但是,这不允许你退回到提示符中,因为它是一个提示而不是输入的一部分。

s = "Hell" + raw_input("Hell")
print s

答案 3 :(得分:0)

如果它是出于你自己的目的,那么这是一个使用剪贴板而不会丢失之前的内容的脏小黑客:

def edit_text_at_terminal(text_to_edit):
    import pyperclip

    # Save old clipboard contents so user doesn't lose them
    old_clipboard_contents = pyperclip.paste()

    #place text you want to edit in the clipboard
    pyperclip.copy(text_to_edit)

    # If you're on Windows, and ctrl+v works, you can do this:
    import win32com.client
    shell = win32com.client.Dispatch("WScript.Shell")
    shell.SendKeys("^v")

    # Otherwise you should tell the user to type ctrl+v
    msg = "Type ctrl+v (your old clipboard contents will be restored):\n"

    # Get the new value, the old value will have been pasted
    new_value= str(raw_input(msg))

    # restore the old clipboard contents before returning new value
    pyperclip.copy(old_clipboard_contents )
    return new_value

请注意,ctrl + v不适用于所有终端,尤其是Windows默认设置(有ways to make it work,但我建议使用ConEmu代替。)

自动执行其他操作系统的击键将涉及不同的过程。

请记住,这是一个快速的黑客,而不是&#34;正确的&#34;解。对于暂时存储在剪贴板上的所有博士论文的丢失,我不承担任何责任。

对于正确的解决方案,有更好的方法,例如Linux的curses,而在Windows上它值得研究AutHotKey(可能会抛出一个输入框,或做一些击键/剪贴板巫术)。