如何在python输出控制台中只清除最后一行?

时间:2017-06-15 10:55:22

标签: python python-3.x ipython python-3.4

我试图从输出控制台窗口清除最后几行。为了达到这个目的,我决定使用创建秒表,并且我已经实现了在键盘中断和输入按键上按下它创建了一圈但是我的代码只创建了一圈而我的当前代码正在清除整个输出屏幕。

clear.py

import os
import msvcrt, time
from datetime import datetime
from threading import Thread

def threaded_function(arg):
    while True:
        input()

lap_count = 0
if __name__ == "__main__":
    # thread = Thread(target = threaded_function)
    # thread.start()
    try:
        while True:
            t = "{}:{}:{}:{}".format(datetime.now().hour, datetime.now().minute, datetime.now().second, datetime.now().microsecond)
            print(t)
            time.sleep(0.2)
            os.system('cls||clear') # I want some way to clear only previous line instead of clearing whole console
            if lap_count == 0:
                if msvcrt.kbhit():
                    if msvcrt.getwche() == '\r': # this creates lap only once when I press "Enter" key
                        lap_count += 1
                        print("lap : {}".format(t))
                        time.sleep(1)
                        continue            
    except KeyboardInterrupt:
        print("lap stop at : {}".format(t))
        print(lap_count)

当我跑

%run <path-to-script>/clear.py 

在我的ipython shell中我只能创建一圈,但它并不是永久性的。

5 个答案:

答案 0 :(得分:2)

仅清除输出中的一行:

print ("\033[A                             \033[A")

这将清除前一行,并将光标置于行的开头。 如果您删除结尾的换行符,则它将移至上一行,因为\033[A意味着将光标向上一行

答案 1 :(得分:0)

Ankush Rathi在此注释上方共享的代码可能是正确的,除了在print命令中使用括号。我个人建议这样做。

print("This message will remain in the console.")

print("This is the message that will be deleted.", end="\r")

要记住的一件事是,如果您通过按F5键在IDLE中运行它,那么外壳程序仍将显示两条消息。但是,如果通过双击运行程序,则输出控制台将删除它。这可能是Ankush Rathi的答案引起的误解。 (在上一篇文章中)

我希望这会有所帮助。

答案 2 :(得分:0)

我知道这是一个非常老的问题,但是我找不到很好的答案。
您必须使用转义字符。 Ashish Ghodake建议使用此

print ("\033[A                             \033[A")

但是如果要删除的行的字符数多于字符串中的空格怎么办? 我认为更好的方法是找出终端的某一行中可以容纳多少个字符,然后像这样在转义字符串中添加“”的对应数字。

import subprocess,time
tput = subprocess.Popen(['tput','cols'], stdout=subprocess.PIPE)
cols = int(tput.communicate()[0].strip()) # the number of columns in a line
i = 0
while True:
    print(i)
    time.sleep(0.1)
    print("\033[A{}\033[A".format(''.join([' ']*cols)))
    i += 1

最后我会说删除最后一行的“功能”是

import subprocess,time
def remove():
    tput = subprocess.Popen(['tput','cols'], stdout=subprocess.PIPE)
    cols = int(tput.communicate()[0].strip())
    print("\033[A{}\033[A".format(''.join([' ']*cols)))

答案 3 :(得分:0)

我认为最简单的方法是使用两个print()来实现干净最后一行。

print("something will be updated/erased during next loop", end="")
print("\r", end="")
print("the info")

第一个 print() 只是确保光标在行尾结束而不是开始新行

第二个 print() 会将光标移动到同一行的开头而不是开始新行

然后很自然地第三个 print() 开始打印光标当前所在的位置。

我还做了一个玩具函数来使用循环和time.sleep()打印进度条,去看看

def progression_bar(total_time=10):
    num_bar = 50
    sleep_intvl = total_time/num_bar
    print("start: ")
    for i in range(1,num_bar):
        print("\r", end="")
        print("{:.1%} ".format(i/num_bar),"-"*i, end="")
        time.sleep(sleep_intvl)

答案 4 :(得分:-1)

如果您打算从控制台输出中删除某一行,

print "I want to keep this line"
print "I want to delete this line",
print "\r " # this is going to delete previous line

print "I want to keep this line"
print "I want to delete this line\r "