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

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


当前回答

其中一个区别如下,当试图将一个字节打印为其十六进制外观时。例如,我们知道十进制值255是十六进制的0xFF:

val = '{:02x}'.format(255)

sys.stdout.write(val) # Prints ff2
print(val)            # Prints ff

其他回答

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

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

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

我的问题是,是否存在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:模式,但有时这样做是值得的。

在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

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

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

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

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

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