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的发展史
Sep 26 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
Python中模块string.py详解
Mar 12 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
基于python实现学生信息管理系统
Nov 22 Python
浅谈keras使用中val_acc和acc值不同步的思考
Jun 18 Python
python实现取余操作的简单实例
Aug 16 Python
pytorch显存一直变大的解决方案
Apr 08 Python
python本地文件服务器实例教程
May 02 Python
python数字类型和占位符详情
Mar 13 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
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
AngularJS基础知识笔记之表格
2015/05/10 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
TensorFlow变量管理详解
2018/03/10 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
德国、奥地利和瑞士最大的旅行和度假门户网站:HolidayCheck
2019/11/14 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
民族学专业求职信
2014/07/28 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
党员检讨书
2014/10/13 职场文书
社区党务工作总结2015
2015/05/19 职场文书
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS