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有点火? 给你7个学习它的理由!
Jun 26 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
python 定义给定初值或长度的list方法
Jun 23 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python 多线程重启方法
Feb 18 Python
python写日志文件操作类与应用示例
Jul 01 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Python模块的制作方法实例分析
Dec 21 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
Python PIL按比例裁剪图片
May 11 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时间戳使用实例代码
2008/06/07 PHP
php相当简单的分页类
2008/10/02 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
2014/05/29 Javascript
vue.js表格分页示例
2016/10/18 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
React中常见的动画实现的几种方式
2018/01/10 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
python求质数列表的例子
2019/11/24 Python
Python通过字典映射函数实现switch
2020/11/06 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
小学庆六一活动方案
2014/02/28 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
MySQL创建索引需要了解的
2021/04/08 MySQL
宝塔更新Python及Flask项目的部署
2022/04/11 Python
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库