sys.stdout.write和print之间的区别?

时间:2010-07-16 09:53:24

标签: python printing stdout

是否有sys.stdout.write()优于print的情况?

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

15 个答案:

答案 0 :(得分:256)

print只是一个瘦的包装器,可以对输入进行格式化(可修改,但默认情况下在结尾处使用args和newline之间的空格)并调用给定对象的write函数。默认情况下,此对象为sys.stdout,但您可以使用“chevron”表单传递文件。例如:

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

请参阅:https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


在Python 3.x中,print成为一个函数,但由于sys.stdout参数,仍然可以传递file以外的其他内容。

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

请参阅https://docs.python.org/3/library/functions.html#print


在Python 2.6+中,print仍然是一个声明,但它可以用作

的函数
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

答案 1 :(得分:131)

print首先将对象转换为字符串(如果它不是字符串)。如果它不是行的开头和结尾处的换行符,它也会在对象之前放置一个空格。

使用stdout时,您需要自己将对象转换为字符串(例如,通过调用“str”),并且没有换行符。

所以

print 99

相当于:

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

答案 2 :(得分:37)

  

我的问题是,是否存在   是在哪种情况下   sys.stdout.write()print好   print

前几天完成开发脚本后,我将其上传到unix服务器。我的所有调试消息都使用sys.stdout.write语句,这些出现在服务器日志中。

这种情况可能需要{{1}}。

答案 3 :(得分:35)

以下是一些基于Mark Lutz的书籍学习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's written to log file instead
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

答案 4 :(得分:11)

至少有一种情况需要sys.stdout而不是打印。

当您想要覆盖一行而不转到下一行时,例如绘制进度条或状态消息时,您需要循环覆盖

之类的内容
Note carriage return-> "\rMy Status Message: %s" % progress

由于print添加了换行符,因此最好使用sys.stdout

答案 5 :(得分:8)

  

我的问题是,是否有sys.stdout.write()优于print

的情况

如果您正在编写可以写入文件和stdout的命令行应用程序,那么它很方便。你可以这样做:

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') as out:模式,但有时它是值得的。

答案 6 :(得分:4)

在Python 3中要指出的printsys.stdout.write之间的差异也是在终端中执行时返回的值。在Python 3中,sys.stdout.write返回字符串的长度,而print仅返回None

因此,例如,在终端中以交互方式运行以下代码将打印出字符串及其长度,因为在交互运行时会返回并输出长度:

>>> sys.stdout.write(" hi ")
 hi 4

答案 7 :(得分:3)

在2.x中,print语句预处理您提供的内容,将其转换为字符串,处理分隔符和换行符,以及允许重定向到文件。 3.x把它变成一个函数,但它仍然有相同的职责。

sys.stdout是一个类似于文件或文件的文件,其中包含用于写入字符串或其他内容的方法。

答案 8 :(得分:1)

  

是否存在sys.stdout.write()更适合的情况   打印?

例如,我正在处理小函数,它在将数字作为参数传递时以金字塔格式打印星形,尽管您可以使用 end =&#34;&#34; <来完成此操作/ em> 要在单独的行中打印,我使用 sys.stdout.write print 使这项工作。要详细说明这个 stdout.write 打印在同一行,而 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)

答案 9 :(得分:1)

  

在某些情况下,最好打印sys.stdout.write()吗?

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

当我在字符串中将\ n与std.out一起使用时,调试I / O格式正确,并且\ n会正确显示。

答案 10 :(得分:1)

在Python 3中,有充分的理由在sys.stdout.write上使用print,但是这个原因也可以变成使用sys.stdout.write的原因。

这是因为,现在print是Python 3中的一个函数,您可以覆盖它。因此,您可以在简单的脚本中的任何地方使用print,并决定这些print语句需要写入stderr中。现在,您可以重新定义打印功能,甚至可以通过使用内置模块更改全局打印功能。当然,file.write可以指定文件是什么,但是覆盖打印也可以重新定义行分隔符或参数分隔符。

另一种方法是。也许您绝对确定要写stdout,但也知道要将打印更改为其他内容,因此可以决定使用sys.stdout.write,并将print用于错误日志或其他内容。

因此,您使用什么取决于您打算如何使用它。 print更加灵活,但这可能是使用和不使用它的原因。我仍然会选择灵活性,然后选择打印。改用print的另一个原因是熟悉度。现在,更多的人会理解您所说的印刷品含义,而对sys.stdout.write的了解却更少。

答案 11 :(得分:1)

当动态打印很有用时(例如,在较长的过程中提供信息),则更可取:

import time, sys
Iterations = 555
for k in range(Iterations+1):
    # some code to execute here ...
    percentage = k / Iterations
    time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
    sys.stdout.write(time_msg)
    sys.stdout.flush()
    time.sleep(0.01)

答案 12 :(得分:1)

当尝试将字节打印成十六进制外观时,以下差异之一。例如,我们知道255的十进制值为十六进制形式的0xFF

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

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

答案 13 :(得分:1)

在Python 2中,如果您需要传递函数,则可以将os.sys.stdout.write分配给变量。您无法使用print(在REPL中执行此操作。)

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

那按预期工作。

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

那是行不通的。 print是一个神奇的功能。

答案 14 :(得分:0)

>>> sys.stdout.write(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1

观察上面的示例:

  1. sys.stdout.write不会写非字符串对象,但是print

  2. sys.stdout.write不会在末尾添加新的线符号,但是print

如果我们深入潜水,

sys.stdout是一个文件对象,可用于输出print()

如果未指定文件参数print(),将使用sys.stdout