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使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python框架Flask的基本数据库操作方法分析
Jul 13 Python
python提取包含关键字的整行数据方法
Dec 11 Python
在python里从协程返回一个值的示例
Feb 19 Python
pyqt5 实现工具栏文字图片同时显示
Jun 13 Python
python中对数据进行各种排序的方法
Jul 02 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
利用python实现AR教程
Nov 20 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
Python读取ini配置文件传参的简单示例
Jan 05 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 图片上传实现代码 带详细注释
2010/04/29 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
javascript解析json实例详解
2014/11/05 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
python二维列表一维列表的互相转换实例
2018/07/02 Python
详解python分布式进程
2018/10/08 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
Python用字典构建多级菜单功能
2019/07/11 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
django-filter和普通查询的例子
2019/08/12 Python
python装饰器原理与用法深入详解
2019/12/19 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
新娘父亲婚礼致辞
2014/01/16 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
小学一年级学生评语
2014/04/22 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
宝塔更新Python及Flask项目的部署
2022/04/11 Python
Win11运行cmd提示“请求的操作需要提升”的两种解决方法
2022/07/07 数码科技