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的Flask框架中使用模版的入门教程
Apr 20 Python
Python3处理文件中每个词的方法
May 22 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
python中PIL安装简单教程
Apr 21 Python
python去除字符串中的换行符
Oct 11 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
python迭代dict的key和value的方法
Jul 06 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
Feb 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实现微信发红包
2015/12/05 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
javascript 闭包
2011/09/15 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
js中作用域的实例解析
2017/03/16 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
python中的多重继承实例讲解
2014/09/28 Python
python中循环语句while用法实例
2015/05/16 Python
Python在线运行代码助手
2016/07/15 Python
Python中int()函数的用法浅析
2017/10/17 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python基于ID3思想的决策树
2018/01/03 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python 实现倒排索引的方法
2018/12/25 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
兴趣小组活动总结
2014/05/05 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
上诉答辩状范文
2015/05/22 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
高二化学教学反思
2016/02/22 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python