2010-07-16 32 views
236

是否有sys.stdout.write()优于print的情况?sys.stdout.write和print之间的区别?

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

+4

哪个版本的Python? 2.x还是3.x? – 2010-07-16 09:54:06

+0

老实说,我想知道这两个,虽然我没有经验的Python 3.更新了这个问题。 – 2010-07-16 09:59:05

+9

@ S.Lott:要求'sys.stdout.write()'和'print'(和/或为什么Python有两个)之间的基本区别是一个完全合理的问题,并且不需要示例。 OP没有说这个命令的语法很混乱。 – smci 2015-01-20 22:07:59

回答

197

print仅仅是一个薄的包装,格式化(末尾指定参数和换行之间的空间)的输入,并调用的写入功能给定的对象。默认情况下,该对象是sys.stdout,但可以使用“V形”形式传递文件。例如:

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 

更新:有打印函数和打印语句之间有一点区别(更一般的是函数和as之间的区别)由Bakuriu在评论中指出)。

在错误的情况下评估参数时:

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 
+28

还值得注意的是, print''还附加了一个换行符,不管你用'sys.stdout.write'都不会发生什么。 – 2010-07-16 11:49:48

+0

@Michael Mior:的确,我已经说过“它格式化输入”,更好的回答会提到什么样的格式化。谢谢澄清。 – luc 2010-07-16 13:35:00

+0

如果你需要编写双版本,'sys.stdout.write'更通用在代码上(例如与Python 2.x以及Python 3.x同时工作的代码)。 – andreb 2010-12-16 03:28:20

2

在2.x中,该print声明预处理你给它,把它变成沿途串,处理分离器和换行,并允许重定向到一个文件。 3.x把它变成一个函数,但它仍然有相同的责任。

sys.stdout是一个文件或文件类,有方法写入它,其中包括字符串或沿该行的东西。

98

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

使用标准输出时,您需要自己将对象转换为字符串(例如,通过调用“str”),并且不存在换行符。

所以

print 99 

相当于:

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

+1提到换行符!这是'print'和'.write()'之间的主要区别,我会说。 – EOL 2010-07-16 14:19:41

+7

注意:'print'可以省略换行符。在Python 2.x中,最后输入一个逗号,并输出空格字符,但不会换行。例如。 'print 99,'在Python 3中,'print(...,end ='')'将避免添加换行符(并且也避免增加空格,除非您执行'end ='''。 – ToolmakerSteve 2013-12-19 02:36:56

+16

@EOL有趣的是,一个名叫EOL的人对'\ n'发表评论......这让我大笑,我没有生命,杀了我 – Depado 2015-06-23 14:14:14

30

我的问题是是否有 在这 sys.stdout.write()最好 print

情况后整理开发脚本有一天,我上传到一个Unix服务器。我的所有调试消息都使用print语句,而这些不会出现在服务器日志中。

这种情况下,您可能需要sys.stdout.write

+1

呵呵?你确定这是'print()'和'sys.stdout.write()'之间的区别,而不是'stdout'和'stderr'之间的区别吗?为了调试,你应该使用'logging'模块,它将消息输出到'stderr'。亚历山大, – ostrokach 2016-01-25 03:05:44

+0

。使用'nohup'并重定向到'.out'文件也是如此。 – 2016-05-09 15:36:11

23

这里的立足之本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 
+0

有什么办法可以打印到屏幕以及写入文件吗? – 2014-05-12 04:15:46

+3

@DeveshSaini:是的,只需使用至少具有write()和flush()函数的代理类覆盖sys.stdout即可。我写了一个示例代码片段(在这里)(http://hastebin.com/owijihizus.py)。 – ponycat 2014-05-21 09:08:04

8

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

5

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

当你想要覆盖的线路没有去到下一行,例如同时提请进度栏或状态消息,您需要循环像

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

而且,由于打印补充一个换行符,你最好用sys.stdout

0

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

例如我工作的,其在经过数作为参数打印在金字塔格式明星小功能,但你可以做到这一点使用年底=“”在一个单独的行打印,我使用sys.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)