print与sys.stdout

在python中,print语句实现打印,从技术角度来说,这是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流,更详细的说,打印与文件和流的概念紧密相连。

我们都知道在python中,向一个文件写东西是通过类似file.write(str)方法实现的,而你可能没想到print语句执行的操作其实也是一个写操作,不过他把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化。当然,和文件方法不通,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们做好了)。

print 123
import sys
sys.stdout.write(str(123)+'\n')

这里的sys.stdout也就是我们python中标准输出流,这个标准输出流默认是映射到打开脚本的窗口的,所以,我们的print操作会把字符打印到屏幕上。既然sys.stdout默认是映射到打开脚本的窗口,那么这个映射关系是否可以修改呢?

答案是肯定的,这也是python中常用的一个小技巧,我们可以通过修改这种映射关系来把我们的打印操作重定向到其它地方,例如特定的文件。方法就是给sys.stdout赋值,修改它的指向。看下面的例子:

import sys
sys.stdout = open('test.txt','w')
print 'Hello world'

可以看到,我们让sys.stdout指向了一个文件对象。然后,再执行打印操作,这时,hello world输出在了一个文件test.txt中:
这里写图片描述
但是,上面的代码有一个问题,我们把打印重定向到了一个文件中,那么在程序后面每一处调用print操作的输出都在这个文件中,那么我们后面想要打印字符到屏幕怎么办?

所以,这就需要我们先保存原始的sys.stdout,后面想要恢复的时候再赋值就行了,实现如下:

import sys
temp = sys.stdout
sys.stdout = open('test.txt','w')
print 'hello world'
sys.stdout = temp #恢复默认映射关系
print 'nice'

sys.stdout除了可以映射到一个文件外,还有什么可以做的吗?当然有的,你甚至可以将sys.stdout赋值为一个自定义的对象,前提是这个对象实现了write方法。毕竟print调用的就是sys.stdout.write()方法。你可以自定义write方法,实现一些复杂的操作。

class Test:
	def write(self,string):
		#do something you wanna do
test = Test()
temp = sys.stdout
sys.stdout = test
print 'hello world'

前面我们是通过给手动给sys.stdout赋值改变print的输出位置,实际上print操作还有更简单的实现重定向的方式,再python2.7下,我们可以通过下面这种形式:

log = open('log.txt','a')
print >> log,'hello world' #重定向到文件log.txt中
print 'hello world' #输出到默认位置

这样一来就方便多了,当然类似的方法也可以应用到sys.stdin上,raw_input()就是调用了sys.stdin.read()方法,所以通过本文的阐述,我想大家应该清楚可以怎么做了。

![这里写图片描述](https://img-blog.csdn.net/20180613104153419?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlX2FuZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 关注我,了解更多精彩内容 print与sys.stdout在python中,print语句实现打印,从技术角度来说,这是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流,更详细的说,打印与文件和流的概念紧密相连。我们都知道在python中,向一个文件写东西是通过类似file.write(str)方法实现的,而你可能没想到print语句执行的操作其实也是一个写操作,不过他把我们从外设输入的...
考虑以下python程序:复制代码 代码如下:#!/usr/bin/env pythonimport syssys.stdout.write(“stdout1 “)sys.stderr.write(“stderr1 “)sys.stdout.write(“stdout2 “)sys.stderr.write(“stderr2 “)其中的sys.stdout.write也可以换成print。运行这程序,你觉得会输出什么?试验一下,就会发现,其实输出并不是复制代码 代码如下:stdout1 stderr1  stdout2 stderr2而是:复制代码 代码如下:stderr1 stderr2 s
print语法格式 print()函数具有丰富的功能,详细语法格式如下: print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False) 默认情况下,将值打印到流或sys.stdout。 可选关键字参数: file:类文件对象(stream); 默认为当前的sys.stdout。 sep:在值之间插入的字符串,默认为空格。 end:在最后一个值后附加的字符串,默认为换行符。 flush:是否强制刷新流。 2、sep可选关键字参数 sep参数可以在值之间插入字符串,默认值为空格。 print(‘1’,‘2’,‘3’,‘4’,
老猿Python博文目录 Python中的标准输出和错误输出由sys模块的stdout、stderr对象负责,所有print语句以及相关的错误信息输出如果要重定向,只需要创建一个类似文件IO的类并将该类的实例替换sys模块的stdout、stderr对象即可。 具体来说,分如下几步完成:
1.print def print(self, *args, sep=' ', end='\n', file=None): # known special case of print print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional key
当我们在 Python 中打印对象调用 print(obj) 时候,事实上是调用了 sys.stdout.write(obj+'\n') print 将你需要的内容打印到了控制台,然后追加了一个换行符 print 会调用 sys.stdout 的 write 方法 以下两行在事实上等价: sys.stdout.write('hello'+'\n') print('hello') import sys temp = sys.stdout f = open('test.txt'.
printstdout 提示:本文摘自最近在学习的一本python书中,主要是说明printstdout之间的关系,说实在需要有一定的基础才能完全看懂,我目前也不是很明白,只是作为记录作用,加深印象,故敲在此处。 理解print语句和sys.stdout之间的等价性是非常重要的。这也是为什么我们可以把sys.stdout重新赋值给用户自定义(能够提供write方法的)的类似文件的对象。因为print语句只是把文本传送给sys.stdout.write方法,所以你可以通过把sys.stdout赋值给一个
sys.stdout.write是Python标准库中的一个函数,它可以将字符串打印到标准输出流(通常是控制台)中。通常,我们使用print语句来打印多行文本,但是如果我们需要在输出过程中实时地显示信息,这时就需要用到sys.stdout.write函数。 当我们在使用sys.stdout.write函数时,如果需要打印多行文本,可以将文本拼接成一个字符串,然后传给函数进行输出。如果需要刷新输出,可以通过调用sys.stdout.flush()方法来实现。 例如,以下代码将循环输出10次几乎相同的文本,并在每次输出后进行刷新: import sys import time for i in range(10): sys.stdout.write("This is line {}\n".format(i)) sys.stdout.flush() time.sleep(1) 在上面的代码中,我们使用了time.sleep(1)函数来模拟输出的实时性,每1秒钟输出一行文本。在每次调用sys.stdout.write函数后,使用sys.stdout.flush()方法来立即刷新输出流,这样可以确保文本被立即打印到控制台中,而不是被缓存起来等待更多文本一起输出。 总的来说,sys.stdout.write函数可以用于输出任意类型的文本,并且通过调用sys.stdout.flush()方法可以确保文本及时打印到控制台中。如果需要打印多行文本,可以将文本拼接成一个字符串,然后一次性传给sys.stdout.write函数来输出。