[Python]print vs sys.stdout.write

时间:2022-05-14 23:14:41

之前只是在项目中看到过,没怎么注意,正好跟对象一起看python学习手册,看到了这个部分于是来研究下。

python版本 2.7.x
os  win7

print

 一般就是执行脚本的时候,把信息直接打印到标准输出,也就是我们通常说的控制台
print是python __builtin__ 中的一个方法,来看看他的定义
def print(stream):
  """ print(value, ..., sep=' ', end='\\n', file=sys.stdout)

  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. """
  pass
从这里我们就能看到print也许比我们常用的功能多一些
* sep 用来做values之间的分割符,所以当我们 print '2', 'a' 的时候,实际中间是空格
* end 默认是换行,所以print总是打印一行信息
* 其实print还可以输出到文件中
但我们又知道python2中的print 后面是没有参数列表的
In [2]: print ('a', 'b', sep='|')
  File "<ipython-input-2-bcb798285c07>", line 1
    print ('a', 'b', sep='|')
                        ^
SyntaxError: invalid syntax

哦噢,报错了,其实只要 from __future__ import print_function 就可以像python3一样使用参数了
In [6]: print('a', 'b')
a b

In [7]: print('a', 'b', sep='--')  #print 多个values 不用逗号分隔
a--b

In [8]: print('nihao');print('orangle')
nihao
orangle

In [9]: print('nihao', end='');print('orangle')  #print 不换行
nihaoorangle

好像print也有不少玩法哦
我们直接把print的值写到文件对象中,而不是默认的sys.stout试
In [11]: f = open('test.txt', 'w')
In [12]: print('haha.....csdn', file=f)
In [15]: ls test.txt
 驱动器 D 中的卷没有标签。
 卷的序列号是 0002-FA2E
 D:\code\python 的目录
2015/01/20 周二  10:37                 0 test.txt
               1 个文件              0 字节
               0 个目录 61,124,526,080 可用字节
In [16]: f.close()
到对应的目录下看看,test.txt的内容,果然是 haha.....csdn, 不过一定要记得 f.close(), 如果不关闭,内容是无法保存到文件中的。

sys.stdout.write

这个方法调用的是 ,file 对象中的write方法 ,把字符写到标准输出中,看起来跟print 差不多。
  def write(self, str):
    """ write(str) -> None.  Write string str to file.

    Note that due to buffering, flush() or close() may be needed before
    the file on disk reflects the data written. """
    return ""

关系

这个方法和print什么关系呢? 我们来查查
可以认为 print是对 sys.stdout.write的友好封装,也只是从 python学习手册这样看到。

区别

print 可以把一个对象转化成str然后放到标准输出中, sys.stdout.write 需要把对象先转化成对象在输出
In [3]: class A():
   ...:     def __str__(self):
   ...:         return "A"
   ...:

In [5]: a = A()
In [6]: print a
A

In [9]: import sys
In [10]: sys.stdout.write(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-0697f962911e> in <module>()
----> 1 sys.stdout.write(a)

TypeError: expected a character buffer object

In [11]: sys.stdout.write(str(a))
A
所以说不能用 sys.stdout.write来直接代替 print


运用

这里两者怎么结合使用?
引用 Learning Python 中的一段代码
import sys
temp = sys.stdout #store original stdout object for later
sys.stdout = open('log.txt','w') #redirect all prints to this log file
print("testing123") #nothing appears at interactive prompt
print("another line") #again nothing appears. It is instead written to log file
sys.stdout.close() #ordinary file object
sys.stdout = temp #restore print commands to interactive prompt
print("back to normal") #this shows up in the interactive prompt

log.txt文件中保存输出结果为
testing123
another line
我们可以把调试中打印的信息保存的文件中,这样也是追中和查找错误的一个方式
还有就是多线程日志中可能会用到
sys.stdout.write 来封装日志写入


参考文章: