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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
python SMTP实现发送带附件电子邮件
May 22 Python
基于Python打造账号共享浏览器功能
May 30 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Python列表推导式实现代码实例
Sep 09 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
Django haystack实现全文搜索代码示例
Nov 28 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-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php获取根域名方法汇总
2014/10/28 PHP
php实现删除空目录的方法
2015/03/16 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
简述Python2与Python3的不同点
2018/01/21 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
最新的互联网创业计划书
2014/01/10 职场文书
党员干部一句话承诺
2014/05/30 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
公证书格式
2015/01/23 职场文书