Python中的sys.stdout.write实现打印刷新

前言:

今天学习python的常用模块的时候,了解到了time模块和datetime模块,于是想在编译环境中实时打印出时间,不会换行,且打印的时候自动删除前一步打印出的时间(本质原理不是这样),而不是像print那样打印之后自动换行再重新打印。

想要直接看到效果及方法,请直接跳到后文 解决办法

我们先来看看Print方法打印的效果:

代码:

from datetime import datetime as dt
import sys
import time

for i in range(5):
    print(dt.now())
    time.sleep(1)

输出结果:

C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/untitled/test.py
2018-08-06 16:46:46.636256
2018-08-06 16:46:47.636313
2018-08-06 16:46:48.636370
2018-08-06 16:46:49.636427
2018-08-06 16:46:50.637484

Process finished with exit code 0

可以看到,用print打印出来自动换行且不会清除上一个结果

help一下看看:

help(print)

输出:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

可以看到end=“\n”表示了print自带换行

如果我想要在一行中打印一串信息,并且在下一次执行的时候删除这一行再重新打印(效果类似如此),该如何做呢?尝试清屏可不可以?

清屏试一试,查阅别的博客的方法有如下代码:

import os

os.system('cls')

但这是在命令行里使用的,用在编译器里不行。

解决办法

这时候就要用到sys.stdout.write了

使用如下方法:

from datetime import datetime as dt
import sys
import time


while True:
    a = dt.now()
    sys.stdout.write("\r{0}".format(a))
    sys.stdout.flush()
    time.sleep(1)

以及:

from datetime import datetime as dt
import sys
import time


for i in range(20):
    a = dt.now()
    sys.stdout.write("\r{0}".format(a))
    sys.stdout.flush()
    sys.stdout.write('\033[4A')
    time.sleep(1)

都可以实现实时打印。

其关键就在于使用'\r'这个转义字符(回到行首),  sys.stdout.write首先打印这一行后不带任何结尾(前文已经说过print打印结尾带end="\n",表示自带换行,换行了就不能在对已经打印的这一行进行更改编辑),使用了转移字符"\r"使得光标回到行首,再把缓冲区显示出来,就得到了我们所需要的效果。

效果输出:

C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/untitled/test.py
2018-08-06 18:26:21.264878

Run只会显示这一个,并且一秒钟更新一次。

这样就可以利用它来打印进度条。

进度条的特点:

     - 有标刻度显示所占总进度比例

     - 有百分比显示所占比例

代码示例:

import time,sys

for i in range(100):
    percent = i / 100
    sys.stdout.write("\r{0}{1}".format("|"*i , '%.2f%%' % (percent * 100)))
    sys.stdout.flush()
    time.sleep(1)

输出效果:


|||||||||||||||||||||||||||||||||33.00%

关于Python常用模块可以见博客:https://blog.csdn.net/github_27109687/article/details/73850886

关于另一些进度条打印的方法见博客:https://blog.csdn.net/saltriver/article/details/53055942

本文资料感谢:

https://www.cnblogs.com/lustralisk/p/pythonProgressBar.html

https://www.v2ex.com/t/292204

初学Python,博客写得不是很好,文中可能有赘述,如有错误望批评指正。谢谢。

猜你喜欢

转载自blog.csdn.net/qq_39161804/article/details/81456913