我正在用Python处理文件夹/文件。为了通知用户,我将一些消息输出到控制台。这些消息看起来与此类似:
Creating folders...
DONE
Creating files...
DONE
All done!
如果过程很短,这很好,但就我而言,过程(和消息)并不短。我不想在成功/失败消息上浪费新的一行。我希望他们看起来像这样:
Creating folders... DONE
Creating files... DONE
All done!
诀窍是在完成特定任务后,将“ DONE”字符串附加到上一行。所以,首先我会看到:
Creating folders...
任务完成后,它将变为:
Creating folders... DONE
并继续下一个任务。我试过不结束行,但不起作用:
print("Creating folders... ", end="")
time.sleep(2) # fake process
print("DONE")
time.sleep(1)
print("Creating files... ", end="")
time.sleep(2)
print("DONE")
很好,它可以工作,但是同时显示两个字符串(任务...结果)(任务完成后)。我看不到上面提到的过渡。
我找到了另一种方法,移至行的开头并替换字符串:
print("Creating folders... ", end="\r")
time.sleep(2) # fake process
print("Creating folders... DONE")
time.sleep(1)
print("Creating files... ", end="\r")
time.sleep(2)
print("Creating files... DONE")
这似乎产生了预期的效果,但是我在重复并扩展前面的消息。我只想输出结果,而不是再重复一次任务消息。
有没有更简单的解决方案?
而且,为什么我尝试的第一种方法没有奏效?我打印文本,但不结束一行。一段时间后,我添加了另一个文本,由于没有换行符,因此将其附加到上一行。由于两次打印之间存在时间差异,因此我应该看到过渡,但是我没有。它们同时打印。为什么会这样?
答案 0 :(得分:5)
您需要在每个打印语句(使用end=""
)之后刷新缓冲区,以确保将消息立即推送到控制台。请参阅print()文档。
带有打印功能的冲洗参数的工作示例:
import time
print("Creating folders... ", end="", flush="True")
time.sleep(2) # fake process
print("DONE")
time.sleep(1)
print("Creating folders... ", end="", flush="True")
time.sleep(2)
print("DONE")
手动冲洗的工作示例:
import time
import sys
print("Creating folders... ", end="")
sys.stdout.flush()
time.sleep(2) # fake process
print("DONE")
time.sleep(1)
print("Creating files... ", end="")
sys.stdout.flush()
time.sleep(2)
print("DONE")