是否有sys.stdout.write()
优于print
的情况?
(示例:更好的性能;代码更有意义)
答案 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()
比
前几天完成开发脚本后,我将其上传到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()
优于
如果您正在编写可以写入文件和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中要指出的print
和sys.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
观察上面的示例:
sys.stdout.write
不会写非字符串对象,但是print
会
sys.stdout.write
不会在末尾添加新的线符号,但是print
将
如果我们深入潜水,
sys.stdout
是一个文件对象,可用于输出print()
如果未指定文件参数print()
,将使用sys.stdout