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中文编码问题小结
Sep 28 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
详解python的几种标准输出重定向方式
Aug 15 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
python lambda表达式在sort函数中的使用详解
Aug 28 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
python爬虫调度器用法及实例代码
Nov 30 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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木马webshell扫描器代码
2012/01/25 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python抓取框架 Scrapy的架构
2016/08/12 Python
Numpy之文件存取的示例代码
2018/08/03 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python删除某个目录文件夹的方法
2020/05/26 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
学生会竞选演讲稿纪检部
2014/08/25 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS