是否存在sys.stdout.write()比print更可取的情况?

(例子:更好的性能;更有意义的代码)


当前回答

我的问题是,是否存在sys.stdout.write()优于print的情况

如果您正在编写一个既可以写入文件又可以写入标准输出的命令行应用程序,那么它就很方便。你可以这样做:

def myfunc(outfile=None):
    if outfile is None:
        out = sys.stdout
    else:
        out = open(outfile, 'w')
    try:
        # do some stuff
        out.write(mytext + '\n')
        # ...
    finally:
        if outfile is not None:
            out.close()

这确实意味着不能使用with open(outfile, 'w')作为out:模式,但有时这样做是值得的。

其他回答

在某些情况下是否更适合使用sys.stdout.write() 打印吗?

例如,我正在处理一个小函数,它在传递数字作为参数时以金字塔格式打印星星,尽管您可以使用end=""在单独的行中打印来完成这一点,但我使用sys.stdout.write与print配合使用来完成此工作。详细说明此标准输出。在同一行中写入打印,而as print总是在单独一行中打印其内容。

import sys

def printstars(count):

    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1

printstars(5)

Print只是一个精简的包装器,它格式化输入(可修改,但默认在args和换行符之间有空格),并调用给定对象的write函数。缺省情况下,该节点为sys。Stdout,但您可以使用“雪佛龙”形式传递文件。例如:

print >> open('file.txt', 'w'), 'Hello', 'World', 2+3

见:https://docs.python.org/2/reference/simple_stmts.html?highlight=print print语句


在Python 3中。X, print变成了一个函数,但是仍然可以传递除了sys。Stdout感谢文件文档。

print('Hello', 'World', 2+3, file=open('file.txt', 'w'))

看到https://docs.python.org/3/library/functions.html打印


在Python 2.6+中,print仍然是一个语句,但它可以用作with的函数

from __future__ import print_function

更新:Bakuriu评论指出,print函数和print语句之间(更一般地说,是函数和语句之间)有一个很小的区别。

如果计算参数时出现错误:

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception

print("something", 1/0, "other") #doesn't print anything. The function is not called

在Python 2中,如果你需要传递一个函数,那么你可以将os.sys.stdout.write赋值给一个变量。你不能这样做(在REPL)打印。

>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>

这和预期的一样。

>>> cmd=print
  File "<stdin>", line 1
    cmd=print
            ^
SyntaxError: invalid syntax

这是行不通的。印刷是一种神奇的功能。

我的问题是是否有 在这些情况下 Sys.stdout.write()更可取 打印

有一天,在完成一个脚本的开发后,我把它上传到unix服务器上。我的所有调试消息都使用打印语句,这些语句不会出现在服务器日志中。

在这种情况下,您可能需要sys.stdout.write来代替。

是否存在sys.stdout.write()比print更可取的情况?

我发现在多线程情况下,stdout比print工作得更好。我使用队列(FIFO)来存储要打印的行,并且在打印行之前保持所有线程,直到打印队列为空。即便如此,使用print我有时会在调试I/O上丢失最后的\n(使用Wing Pro IDE)。

当我在字符串中使用带\n的std.out时,调试I/O格式正确且\n被准确地显示出来。