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 26 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
python动态网页批量爬取
Feb 14 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
python 平衡二叉树实现代码示例
Jul 07 Python
python爬取哈尔滨天气信息
Jul 14 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
Flask模板引擎Jinja2使用实例
Apr 23 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中apc缓存使用示例
2013/12/25 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
Python下载懒人图库JavaScript特效
2015/05/28 Python
python select.select模块通信全过程解析
2017/09/20 Python
Python构建网页爬虫原理分析
2017/12/19 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python argparse模块应用实例解析
2019/11/15 Python
pytorch中图像的数据格式实例
2020/02/11 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python实现播放和录制声音的功能
2020/08/12 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript