python中time.sleep的奇怪打印行为

时间:2016-03-03 16:40:23

标签: python sleep

我试图通过在同一行上每秒打印一个点来创建类似进度的东西。像“钓鱼......”之类的东西。这是我用过的:

import time

print('Fishing', end='')
for i in range(5):
    time.sleep(1)
    print('.', end='')

但等待5秒钟并同时打印Fishing.....。但是当我不使用end=''时,它会每秒打印一次点,但是会在不同的行上打印

Fishing.
.
.
.
.

我的问题:

  1. 为什么print会这样做?
  2. 如何每秒打印一个点,但是在同一行?

3 个答案:

答案 0 :(得分:6)

  1. 为什么print会这样做?
  2. 这与您的终端print及更多内容关系不大。出于性能原因,文本只会被刷新"每次有换行符,而不是一次只有一个字符。

    1. 如何每秒打印一个点,但是在同一行?
    2. 通过"冲洗"每次打印时手动标准输出:

      import time
      import sys
      
      print('Fishing', end='')
      sys.stdout.flush()
      for i in range(5):
          time.sleep(1)
          print('.', end='', flush=True)  # another way
      

      如果您一直需要这个,您可以定义一个单独的冲洗打印功能:

      from functools import partial
      myprint = partial(print, end='', flush=True)
      myprint('Fishing')
      for i in range(5):
          time.sleep(1)
          myprint('.')
      

答案 1 :(得分:2)

这是因为file.flush()被认为是昂贵的操作:它通常会等到它必须打印大量数据,或者直到遇到新行(通常只有如果输出写入终端):

  

输出缓冲由文件决定。例如,使用background-position: right center;确保在屏幕上立即显示。

显然,它需要几分钟的代价并不昂贵:但是要求终端操作员打印新内容,或者操作系统将数据写入文件(在I / O重定向的情况下)仍然不是&# 34;快速闪电"。

您可以使用flush on the standard output channel强制打印仍在队列中的所有数据。

答案 2 :(得分:1)

使用

 print('.', end="", flush=True)