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


Posted in Python onFebruary 21, 2020

前言:

今天学习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小知识-sys.stdout.write和print进度条打印方式

打印进度条的方法用两种:

一、sys.stdout.write方式

这个方法中必须使用这句话每次来清理缓存。

sys.stdout.flush()

import sys
import time

i = 0
for i in range(20):
  time.sleep(1)
  sys.stdout.write("\r# Process: %0.1f %%" % (float(i + 1) / float(20) * 100))
  sys.stdout.flush()

二、print方式

其中用print('',end='')来实现sys.stdout.write()

import time
i = 0
for i in range(20):
  time.sleep(1)
  print("\r# Process: %0.1f %%" % (float(i + 1) / float(20) * 100),end="")

结果如图1所示:

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

图1

三、\r等转义字符操作

转义字符 描述
\ 反斜杠符号
\r 回车
\t 横向制表符
\n 换行
\' 单引号
\” 双引号
\oyy 八进制数yy代表的字符,例如:\o12代表换行
\xyy 十进制数yy代表的字符,例如:\x0a代表换行
\f 换页
\b 退格(Backspace)

以上这篇Python中的sys.stdout.write实现打印刷新功能就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python发送以整个文件夹的内容为附件的邮件的教程
May 06 Python
在Django中创建动态视图的教程
Jul 15 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
python实现翻转棋游戏(othello)
Jul 29 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
python构建指数平滑预测模型示例
Nov 21 Python
Python装饰器原理与基本用法分析
Jan 07 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
python 最简单的实现适配器设计模式的示例
Jun 30 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 #Python
python编程进阶之异常处理用法实例分析
Feb 21 #Python
python编程进阶之类和对象用法实例分析
Feb 21 #Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 #Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 #Python
python读写文件write和flush的实现方式
Feb 21 #Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 #Python
You might like
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
php获取文件内容最后一行示例
2014/01/09 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
webpack打包js的方法
2018/03/12 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
详解python进行mp3格式判断
2016/12/23 Python
flask入门之表单的实现
2018/07/18 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
美国在线家装零售商:Build.com
2016/09/02 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
校运动会广播稿300字
2014/10/07 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis