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 面向对象 成员的访问约束
Dec 23 Python
python3访问sina首页中文的处理方法
Feb 24 Python
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 Python
python使用pymysql实现操作mysql
Sep 13 Python
详解python3中socket套接字的编码问题解决
Jul 01 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
python变量命名的7条建议
Jul 04 Python
如何基于Python批量下载音乐
Nov 11 Python
在notepad++中实现直接运行python代码
Dec 18 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
mysql5写入和读出乱码解决
2006/11/25 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python循环输出三角形图案的例子
2019/11/22 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
教育技术职业规划范文
2014/03/04 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
完整版商业计划书
2014/09/15 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
团组织关系介绍信
2019/06/24 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
Go timer如何调度
2021/06/09 Golang
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers