print() 方法的语法:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

其中file = sys.stdout的意思是,print函数会将内容打印输出到标准输出流(即 sys.stdout),当然也可以自定义输出流:

with open('test.log', 'a') as f:
print('hello world!', file=f)
# 内容输出到了test.log文件中,终端不会打印任何内容

也可以输出到错误输出流sys.stderr

import sys
print('hello world!', file=sys.stderr)
# 》》hello world!

其实print函数的默认输出等价于sys.stdout.write(),只是print会自动换行,而stdout需要手动添加转义符"\n"

import sys
print('hello world!')
# 》》hello world!
sys.stdout.write('hello world!\n')
# 》》hello world!

而print的输出是否被缓存通常决定于file,但如果flush参数值为True,流会被强制刷新(flush默认为false)。这里需要先看下缓冲是怎么回事

类型 说明 输出情况
满缓冲 I/O操作只有在缓冲区被填满之后才会进行 1.缓冲区满
2.刷出数据flush
3.关闭文件
行缓冲 通常只有遇到换行符时,才会执行实际的I/O操作;但缓冲区满也会强制执行 1.遇到换行符
2.缓冲区满
3.刷出数据flush
4.关闭文件
无缓冲 不缓存,直接进行I/O操作 直接输出

可以在Python3官方文档中查到:When interactive, stdout and stderr streams are line-buffered. 标准输出流stdout和错误输出流stderr是行缓冲
那么当file = stdout或者file = stderr时会按照行缓冲的条件输出到终端,即需要满足以下其中一个条件才会显示打印内容:
1. 遇到换行符'\n'
2. 代码运行结束或缓冲区满
3. flush = True

现在终于可以看下摘自runoob.com的例子了,print()函数使用 flush 参数生成一个 Loading 的效果:

import time

print('---RUNOOB EXAMPLE : Loading 效果---')

print('Loading', end='')
for i in range(20):
print('.', end='', flush=True)
time.sleep(0.5)

效果如下图:

因为print使用end=' '去掉了换行,如果没有flush=True的话,程序将在最后一次性的打印出结果“Loading....................”

根据前面讲述的等效关系,又写了两种方法来实现上面的效果

第一种是通过sys.stdout.write()来实现:

import sys
import time sys.stdout.write('Loading')
for i in range(20):
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(0.5)

第二种是通过sys.stderr.write()来实现,但是差别来了,其实网上随便查下stderr,会发现大多说它是无缓冲的,据说是从3.7版本之后变成的行缓冲,我用3.7.6版本执行代码是行缓冲的效果,2.7.10版本确实是无缓冲的效果了

import sys
import time sys.stderr.write('Loading')
for i in range(20):
sys.stderr.write('.')
time.sleep(0.5)

无缓冲会直接输出,便用不着sys.stdout.flush()来强制刷新了

关于print()、sys.stdout、sys.stderr的一些理解的更多相关文章

  1. 【python】print · sys.stdout · sys.stderr

    参考文档 Python重定向标准输入.标准输出和标准错误 http://blog.csdn.net/lanbing510/article/details/8487997 python重定向sys.st ...

  2. PyQt(Python+Qt)学习随笔:print标准输出sys.stdout以及stderr重定向QTextBrowser等图形界面对象

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 <在Python实现print标准输出sys.stdout.st ...

  3. 在Python实现print标准输出sys.stdout、stderr重定向及捕获的简单办法

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 Python中的标准输出和错误输出由sys模块的stdout.stde ...

  4. sys.stdout sys.stderr的用法

    stdout:标准输出 stderr:标准错误 print  相当于 sys.stdout.write() + 换行 一个将数据流写入文件的程序,文件名为:main.py def main(out=s ...

  5. python 标准输入输出sys.stdout. sys.stdin

    import sys, time ## print('please enter your name:')# user_input=sys.stdin.readline()# print(user_in ...

  6. Python sys.stdout sys.stdin

    引用自:https://www.cnblogs.com/keye/p/7859181.html 引用自:https://blog.csdn.net/sxingming/article/details/ ...

  7. sys.stdout 重定向

    通俗的来说,sys.stdout的功能类似与C++里面的文件输出功能fprintf. 接下来直接入正题,让我们来看代码: >>> import sys >>> te ...

  8. python之sys.stdout、sys.stdin

    转自:http://www.cnblogs.com/turtle-fly/p/3280519.html 本文环境:Python 2.7  使用 print obj 而非 print(obj) sys. ...

  9. python之sys.stdout、sys.stdin以及设置打印到日志文件等

    转自:https://www.cnblogs.com/BigFishFly/p/6622784.html python之sys.stdout.sys.stdin 转自:http://www.cnblo ...

随机推荐

  1. Python和Anoconda和Pycharm联合使用教程

    简介 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. ...

  2. uniapp后台api设计(微信user表)

    MySQL 创建数据库: CREATE  DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[ ...

  3. 伟大的悲剧——记CSP2019

    伟大的悲剧——记CSP2019 就算伟大,依然悲剧…… 现在我好恨自己 我……差一点……就是省一了…… 这一点是多少呢? 2分! 1名! 省一65人,我第66! 唉……太悲催了…… jx的分数线居然还 ...

  4. opencv中的图像矩(空间矩,中心矩,归一化中心矩,Hu矩)

    严格来讲矩是概率与统计中的一个概念,是随机变量的一种数字特征.设 x 为随机变量,C为常数,则量E[(x−c)^k]称为X关于C点的k阶矩.比较重要的两种情况如下: 1.c=0,这时a_k=E(X^k ...

  5. 《Adaptive Density Map Generation for Crowd Counting》密集人群检测论文笔记

    背景 密度图\(D_g\)的生成对于最终网络预测结果\(D_e\)至关重要,但是密度图\(D_g\)生成的过程中,高斯核的大小常常是手动设定的,并且对于不同的数据集,核大小和形状通常不一样.这些手动选 ...

  6. mongodb4.xxx 安装,和基本配置

    .社区版 下载地址 ww.mongodb.com/download-center/community .配置环境变量 安装目录下的 bin 目录 ,C:\z_MongoDB\bin:配置到系统环境变量 ...

  7. linux下定时网站文件备份和数据备份以及删除旧备份标准代码

    直切正题: 文件备份:web.sh 数据备份:db.sh 删除旧备份:clear.sh vi web.sh文件内容为: #!/bin/bash        解释:shell脚本标准头 cd  网站文 ...

  8. java 快速生成树的方式

    public class XzqhDto { @ApiModelProperty("另加数据") private String label; @ApiModelProperty(& ...

  9. STL-deque 双端数组简析

    #include <iostream> #include <deque> using namespace std; int main() { // 插入 deque<in ...

  10. 树莓派pip安装opencv报错,Could not find a version that satisfies the requirement cv2 (from versions: )No matching distribution found for cv2

    前言 我在使用pip install opencv-python 时报错 Could not find a version that satisfies the requirement opencv ...