Python打印保持在同一行

标签 python macos

<分区>

import os
import time

h = 0
s = 0
m = 0

while s <= 60:
    os.system('clear')
    print h, "hours", m, 'minutes', s, 'seconds'
    time.sleep(1)
    s += 1
    if s == 60:
        m += 1
        s = 0
    elif m == 60:
        h += 1
        m = 0
        s = 0

我上面有这段代码。一切正常,并且按预期进行,但我想这样做,以便它在同一行中打印所有语句。例如,它应该打印出 0 小时 0 分 0 秒,然后在同一行上打印出 0 小时 0 分 1 秒,第二个变量是唯一发生变化的变量。我该怎么做呢?我已经尝试使用 os.system('clear') 命令,但它不起作用。我在 Mac OSX 10.7 上运行它。

最佳答案

您应该使用终端提供的内容。在大多数情况下,您需要使用'\r'(回车,返回到该行的第一列);但根据操作系统的不同,这可能会被解释为它还会附加一个换行符。我觉得我记得 OSX 可能会这样做。

您还需要避免自动换行 print 将始终附加。您可以为此使用尾随逗号,但这有问题(杂散空间,不刷新)。所以我建议改用 sys.stdout.write() 并且因为没有换行符通常不会进行刷新,所以你应该明确地使用 sys.stdout.flush()

然后,返回到第一列不会删除旧的输出,所以它只会被下一行覆盖。如果它比之前的短,你就会有拖尾垃圾。为避免这种情况,请再次使用您的终端提供的内容(通常 '\x1b[K' 会在不移动光标的情况下删除行尾之前的所有内容,但如果这对您不起作用,请打印一些空格或确保您的输出格式始终为相同的宽度)。

EL = '\x1b[K'  # clear to end of line
CR = '\r'  # carriage return
sys.stdout.write(("%d hours %d minutes %s seconds" + EL + CR) % (h, m, s))
sys.stdout.flush()

一个更合适的方法(除了使用文字序列的快捷方式之外)是使用官方的 curses 库。

import curses
curses.setupterm()
EL = curses.tigetstr('el')
CR = curses.tigetstr('cr')

如果 CR 真的不能像我们希望的那样在 OSX 上运行,那么您的 termcaps 中可能有 goto 以转到特定位置(例如第一列),或者您可以使用 save_cursor (SC) 和 restore_cursor (RC) 恢复之前保存的位置:

sys.stdout.write(SC + "%d hours %d minutes %s seconds" + EL + RC % (h, m, s))

关于Python打印保持在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21574506/

相关文章:

python - Pandas DataFrame 高效的数据移动

c - Makefile 适用于 OS X 但不适用于 Ubuntu

swift - 如何仅为一个特定的修改器更改应用动画?

ios - 调用异步 API 时如何等待某些操作完成

objective-c - 双击 NSOutlineView 的标题是否触发双击方法?

python - 在python中处理递归错误回溯

python - Python 中的 ^= 运算符

python - Django:ManyToMany 能够排序并添加/删除关系?

python - 有没有办法在大括号内分解 f 弦?

macos - 将本地配方注入(inject)到brew中