在同一行上打印(覆盖)不能按预期工作

时间:2016-12-19 19:10:34

标签: python python-3.x pycharm

我的代码的snipet看起来像这样:

print(' ⦾ Loading subcase decryption table...', end='')
codes_dict = load_codes(codes_file)
print('\r ✓ Subcase decryption table loaded.')

这样做的目的是将一条消息显示为反馈某些内容正在运行(以及如此):

>> ⦾ Loading subcase decryption table...

一旦完成,就必须替换(在同一条线上):

>> ✓ Subcase decryption table loaded.

但这不起作用。相反,第一个print语句必须以'\r'中的返回字符print('\r ⦾ Loading subcase decryption table...', end='')开头,但我只是不明白为什么......

如果它像这样循环,那将是完全合理的:

for i in range(76):
    print('\r {:7.2%}'.format((i + 1) / 76), end='')

有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:2)

原因(最有可能)是你的shell是line buffered。发送给它的任何文本都会缓冲到一定长度或直到遇到\r。这样做的原因是,如果程序写出单个字符,将渲染内容推迟到最新但用户方便的时刻,则可以最大限度地减少开销。

  

对交互设备使用行缓冲意味着输出   以换行符结尾的邮件会立即显示 - 通常是这样   你想要什么。不以换行符结尾的输出可能会也可能不会   立即显示,所以如果你想让它们立刻出现,你   应该使用fflush

显式刷新缓冲输出

线路缓冲是你的第一条线永远不会出现的原因;如果您在行前加\r,则可以有效地刷新行缓冲区。

解决方案通常是直接写入底层流或强制缓冲区刷新。