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

是否有情况下, sys.stdout.write()是可取的print

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

print只是一个很薄的包装器,用来格式化input(最后的args和换行符之间的空格),并调用给定对象的write函数。 默认情况下这个对象是sys.stdout ,但是你可以使用“chevron”forms传递一个文件。 例如:

 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成为一个函数,但是由于file参数的原因,仍然可以传递比sys.stdout东西。

 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 func is not called 

“打印”首先将对象转换为一个string(如果它不是一个string)。 如果不是一行的开始和换行符的结尾,它还会在对象之前放置一个空格。

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

所以

 print 99 

相当于:

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

我的问题是是否有情况下, sys.stdout.write()是可取的print

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

这是你可能需要sys.stdout.write的情况。

以下是一些基于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 

我的问题是是否有情况下, 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') as out: pattern,但有时它是值得的。

至less有一种情况需要sys.stdout而不是print。

当你想覆盖一行而不去下一行时,比如画一个进度条或状态信息时 ,你需要循环一些东西

 Note carriage return-> "\rMy Status Message: %s" % progress 

由于打印添加换行符,所以最好使用sys.stdout

在2.x中, print语句预处理你给它的东西,把它变成string,处理分隔符和换行符,并允许redirect到一个文件。 3.x把它变成一个函数,但它仍然有相同的责任。

sys.stdout是一个文件或文件的types,它有写入的方法,其中包括string或沿着该行的东西。

是否有情况下,sys.stdout.write()是可取的打印?

例如,我正在处理一个以金字塔格式打印星号的小函数,虽然你可以使用end =“”来完成这个工作,而在单独的一行中打印,我在协调中使用了sys.stdout.write印刷品 ,使这项工作。 详细说明这个stdout.write打印在同一行, 打印总是打印它的内容在一个单独的行。

 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)