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守护进程(daemon)代码实例
Mar 06 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python实现拓扑排序的基本教程
Mar 11 Python
pandas.DataFrame 根据条件新建列并赋值的方法
Apr 08 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
Tensorflow实现将标签变为one-hot形式
May 22 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基础知识:类与对象(1)
2006/12/13 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
用javascript控制iframe滚动的代码
2007/04/10 Javascript
js 判断 enter 事件
2009/02/12 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
js 操作符汇总
2014/11/08 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
Python操作csv文件实例详解
2017/07/31 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python 对key为时间的dict排序方法
2018/10/17 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
django最快程序开发流程详解
2019/07/19 Python
pandas数据处理进阶详解
2019/10/11 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
11月红领巾广播稿
2014/01/17 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
公司文体活动总结
2015/05/07 职场文书
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL