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 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
pycharm安装图文教程
May 02 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
python pandas 对series和dataframe的重置索引reindex方法
Jun 07 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
python使用requests.session模拟登录
Aug 09 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
python模块如何查看
Jun 16 Python
Django REST Swagger实现指定api参数
Jul 07 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
用pip给python安装matplotlib库的详细教程
Feb 24 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/05/15 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
json 定义
2008/06/10 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
法国珠宝店:CLEOR
2017/01/29 全球购物
给老师的道歉信
2014/01/11 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
深入理解python多线程编程
2021/04/18 Python
详解Java实践之适配器模式
2021/06/18 Java/Android