【问题标题】:Overwriting/clearing previous console line覆盖/清除先前的控制台行
【发布时间】:2016-07-30 22:17:00
【问题描述】:

我的问题是,我希望能够在 python 控制台中覆盖/清除以前的打印行。这个问题已经被问过很多次了(例如Python - Remove and Replace Printed items),但是使用相同的代码 (标记为正确的答案,对我来说根本没有打印出来):

for i in range(10):
    print("Loading" + "." * i)
    time.sleep(1)
    sys.stdout.write("\033[F") # Cursor up one line
    sys.stdout.write("\033[K") # Clear to the end of line

我得到输出(在 python IDLE 中):

Loading
[F[KLoading.
[F[KLoading..
[F[KLoading...
[F[KLoading....
[F[KLoading.....
[F[KLoading......
[F[KLoading.......
[F[KLoading........
[F[KLoading.........
[F[KLoading..........
[F[K

有什么想法吗?我用谷歌搜索了很多,没有任何效果。它要么不打印,要么不覆盖。

如果有帮助,我正在运行 Windows 8.1 和 Python 3.51。通过 cmd 运行代码不会影响任何事情。

另外,添加 sys.stdout.flush() 也无济于事。

【问题讨论】:

标签: python python-3.x stdout


【解决方案1】:

python 3.4+ 的更新答案

虽然 print 函数具有行结束符和行刷新关键字参数,但您可以使用这种方式。

text = str()
for i in range(10):
    text = "Loading{}".format("." * i)
    print(text, end="\r", flush=True)
print(" " * len(text), end="\r")

我找不到更优雅的解决方案来清理最后的生产线。如果有人知道,请与我分享。

【讨论】:

    【解决方案2】:

    否则如果你只想渲染,你可以这样做,

    import sys
    import time
    
    # point by point
    msg = "Loading"
    
    print(msg, end="")
    
    for _ in range(10):
        print(end=".")
        sys.stdout.flush()
        time.sleep(1)
    print()
    
    # Or all char by char
    i = 10
    msg = "Loading" + "." * i
    
    for char in msg:
        print(end=char)
        sys.stdout.flush()
        time.sleep(1)
    print()
    

    希望能帮到你。谢谢

    【讨论】:

      【解决方案3】:

      您正在尝试使用 ANSI 转义序列来移动光标。 Windows 默认不支持这些。要启用它们,您可以在终端中安装带有 pip install coloramacolorama 模块,然后在 Python 中:

      import colorama
      colorama.init()
      

      如果您已升级到 Windows 10,则可以改为启用支持:

      import ctypes
      kernel32 = ctypes.windll.kernel32
      kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)
      

      (来源:https://stackoverflow.com/a/36760881/6379747

      【讨论】:

        【解决方案4】:

        您需要从命令行运行程序,而不是在 IDLE 中。

        那么,这应该可以了:

        import sys
        import time
        
        for i in range(10):
            sys.stdout.write("\r" + "Loading" + "." * i)
            time.sleep(1)
            sys.stdout.flush()
        print()
        

        \r 转到行首。所以你必须确保你的字符串 print 至少和之前的一样长。否则,您将看到以前打印的部分内容。

        【讨论】:

        • 如果字符串长度可变,最好用空格填充字符串的其余部分,例如strvar.ljust(10,' ')
        • 如果打印线是彩色的,我们也可以应用这个吗?
        猜你喜欢
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多