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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
Python解析json文件相关知识学习
Mar 01 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
Python字符串处理实现单词反转
Jun 14 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
Python玩转Excel的读写改实例
Feb 22 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
python如何导出微信公众号文章方法详解
Aug 31 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
如何选购合适的收音机
2021/03/01 无线电
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
轮播图组件js代码
2016/08/08 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
使用Scrapy爬取动态数据
2018/10/21 Python
python argparser的具体使用
2019/11/10 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
老兵退伍标语
2014/10/07 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python