是否存在sys.stdout.write()比print更可取的情况?

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


当前回答

在Python 2中。在X中,print语句对你给它的内容进行预处理,将其转换为字符串,处理分隔符和换行符,并允许重定向到文件。Python 3。X将其转换为一个函数,但它仍然具有相同的职责。

sys。Stdout是一个文件或类似文件的类,它有一些方法用于写入它,这些方法接受字符串或沿着这一行的东西。

其他回答

你问,

sys.stdout.write和print的区别是什么?`

我所知道的解释它的最好方法是向您展示如何使用sys.stdout来编写print

下面我提供了三种不同的方法来实现python的print函数:

实现1

import sys

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation One
    file.write(sep.join(str(arg) for arg in args))
    file.write(end)

实现2

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # Implementation 2    
    file.write(str(args[0]))
    for arg in args[1:]:
        file.write(sep)
        file.write(str(arg))
    file.write(end)
    return

实现3

def print(*args, sep=" ", file=sys.stdout, end="\n") -> None:
    # implementation 3 
    it = iter(args)
    arg = next(it)
    file.write(str(arg))
    try:
        while True:
            arg = next(it)
            file.write(sep)
            file.write(str(arg))
    except StopIteration:
        pass
    file.write(end)
    return None

我的问题是是否有 在这些情况下 Sys.stdout.write()更可取 打印

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

在这种情况下,您可能需要sys.stdout.write来代替。

在Python 3中,使用sys.stdout进行打印是有正当理由的。写,但是这个原因也可以变成使用sys.stdout.write的原因。

这个原因是,现在print是python3中的一个函数,你可以重写它。所以你可以在一个简单的脚本中到处使用print,并决定这些print语句需要写入到stderr。你现在可以重新定义打印函数,你甚至可以通过使用内置模块改变打印函数全局。偏离了轨道。写可以指定文件是什么,但通过覆盖打印,还可以重新定义行分隔符或参数分隔符。

反之亦然。也许您完全确定写入到stdout,但也知道要将打印更改为其他内容,您可以决定使用sys.stdout。写,并使用打印错误日志或其他东西。

所以,你使用什么取决于你打算如何使用它。打印更灵活,但这可能是使用或不使用它的原因。我还是会选择比较灵活的款式,选择印花。另一个使用印刷版的原因是熟悉。现在更多的人知道你说的print是什么意思,而更少的人知道sys.stdout.write。

下面是一些基于Mark Lutz的《Learning 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而不是print。

当您希望覆盖一行而不转到下一行时,例如在绘制进度条或状态消息时,您需要在以下内容上进行循环

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

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