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中吸引人的一些特性
Apr 09 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
Python实现图片转字符画的示例
Aug 22 Python
机器学习python实战之手写数字识别
Nov 01 Python
对Python中type打开文件的方式介绍
Apr 28 Python
如何优雅地处理Django中的favicon.ico图标详解
Jul 05 Python
Python列表生成式与生成器操作示例
Aug 01 Python
python继承threading.Thread实现有返回值的子类实例
May 02 Python
Python基于pandas爬取网页表格数据
May 11 Python
python编写实现抽奖器
Sep 10 Python
next在python中返回迭代器的实例方法
Dec 15 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 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
PHP实现的简单日历类
2014/11/29 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
scrapy爬虫实例分享
2017/12/28 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
关于工资低的辞职信
2014/01/14 职场文书
蓝颜请假条
2014/04/11 职场文书
公司委托书范本5篇
2014/09/20 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript