在向控制台写入回车符时,整行文本都会被删除?

8
我有一个用Python编写的程序,它广泛使用换行符以产生更新控制台行的效果(特别是进度条)。在尝试在PyCharm中调试代码时,我发现进度条直到完成后才会被打印出来。
经过进一步检查,发现当打印回车符(\r)时,整行都被删除了。因为库本身写入的字符串形式为({line}\r),所以我总是得到一个空行。
示例代码:
import sys
sys.stdout.write('xxx')
sys.stdout.flush()
time.sleep(1)
sys.stdout.write('\rZZ')
sys.stdout.flush()
time.sleep(1)
sys.stdout.write('yyy\r')
sys.stdout.flush()

time.sleep(1)

print ('===')

我的运行结果如下:

  1. 打印出xxx
    [1秒后]
  2. 打印出ZZ
    [1秒后]
  3. 删除该行
    [1秒后]
  4. 打印出===并结束程序

无论在调试或运行控制台中运行此脚本时都会发生这种情况。

3个回答

9
答案实际上在您的帖子中。正如您所说,回车符会删除整行。为避免这个问题,在打印新行时只打印回车符,像这样:
在每行的开头打印回车符,不使用默认的end='\n'。虽然我没有进行太多测试,但不需要刷新。
print('\rxxx', end='')
# sys.stdout.flush()
time.sleep(1)

继续像这样...

print('\rZZ', end='')
time.sleep(1)

print('\ryyy', end='')
time.sleep(1)

保留最后一份打印输出,保持默认结束。
print('\r===')

6
该漏洞仍然存在,此处有相关报告:这里。目前,如果您使用“运行”>“配置”>“在输出控制台中模拟终端”,回车符将正常工作。

2

在打印时间短和打印字符串长度短的情况下,打印可能会出现问题,并且一行中只能打印少量值。

为了解决这个问题,您可以在空格字符后添加第二个 \r:

for i in range(10):
    print("\r \r{0}".format(str(i)), end='')
    time.sleep(0.1)

我针对类似问题的解决方案是:https://dev59.com/pKHia4cB1Zd3GeqPNg85#44524422


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接