Python – 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()
是可取的
有一天,我完成了一个脚本的开发,然后把它上传到一个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()
是可取的
如果你正在编写一个可以写入文件和标准输出的命令行应用程序,那么它是很方便的。 你可以做这样的事情:
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)