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调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Django中处理出错页面的方法
Jul 15 Python
Python中的Django基本命令实例详解
Jul 15 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
Python序列类型的打包和解包实例
Dec 21 Python
Pytorch之finetune使用详解
Jan 18 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
python实现最速下降法
Mar 24 Python
django model通过字典更新数据实例
Apr 01 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 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
PHP和XSS跨站攻击的防范
2007/04/17 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python素数检测实例分析
2015/06/15 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
python烟花效果的代码实例
2020/02/25 Python
python 读取.nii格式图像实例
2020/07/01 Python
python文件及目录操作代码汇总
2020/07/08 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
电气技术员岗位职责
2013/11/19 职场文书
银行委托书范本
2014/04/04 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
采购部年度工作总结
2015/08/13 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python