sys.stdout.write 和 print 之间的区别?
- 2025-03-04 08:24:00
- admin 原创
- 85
问题描述:
有哪些情况比sys.stdout.write()
更可取print
?
(例如:更好的性能;更有意义的代码)
解决方案 1:
print
只是一个薄包装器,用于格式化输入(可修改,但默认情况下在参数和末尾的换行符之间有一个空格)并调用给定对象的写入函数。默认情况下,此对象是sys.stdout
,但您可以使用“人字形”形式传递文件。例如:
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 "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
解决方案 2:
print
首先将对象转换为字符串(如果它还不是字符串)。它还会在对象前面放置一个空格(如果它不是行首)并在对象末尾放置一个换行符。
使用时stdout
,需要自己将对象转换为字符串(例如,调用“str”),并且没有换行符。
所以
print(99)
相当于:
import sys
sys.stdout.write(str(99) + '
')
解决方案 3:
以下是基于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
解决方案 4:
我的问题是,是否存在
sys.stdout.write()
更好的
情况
前几天开发完一个脚本后,我将其上传到 unix 服务器。我的所有调试消息都使用了print
语句,而这些语句不会出现在服务器日志中。
这是一个您可能需要的情况sys.stdout.write
。
解决方案 5:
至少有一种情况您需要使用sys.stdout
它而不是打印。
当你想覆盖某一行而不转到下一行时,例如在绘制进度条或状态消息时,你需要循环执行类似的操作
Note carriage return-> "
My Status Message: %s" % progress
而且由于 print 添加了换行符,因此最好使用sys.stdout
。
解决方案 6:
我的问题是,是否存在
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 + '
')
# ...
finally:
if outfile is not None:
out.close()
这确实意味着您不能使用该with open(outfile, 'w') as out:
模式,但有时这是值得的。
解决方案 7:
在 Python 2.x 中,该print
语句会预处理您提供的内容,在此过程中将其转换为字符串,处理分隔符和换行符,并允许重定向到文件。Python 3.x 将其转换为函数,但它仍具有相同的职责。
sys.stdout
是一个文件或类似文件的类,它具有用于写入的方法,可以使用字符串或类似的方法。
解决方案 8:
print
在 Python 3 中需要指出的是和之间的一个区别sys.stdout.write
,也是在终端中执行时返回的值。在 Python 3 中,sys.stdout.write
返回字符串的长度,而print
仅返回None
。
因此,例如在终端中以交互方式运行以下代码将打印出字符串及其长度,因为在以交互方式运行时会返回并输出长度:
>>> sys.stdout.write(" hi ")
hi 4
解决方案 9:
当动态打印有用时,最好这样做,例如,在较长的过程中提供信息:
import time, sys
Iterations = 555
for k in range(Iterations+1):
# Some code to execute here ...
percentage = k / Iterations
time_msg = "
Running Progress at {0:.2%} ".format(percentage)
sys.stdout.write(time_msg)
sys.stdout.flush()
time.sleep(0.01)
解决方案 10:
>>> 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
则将使用
解决方案 11:
在 Python 3 中,使用 print over 是有充分理由的sys.stdout.write
,但这个理由也可以转化为使用sys.stdout.write
相反的理由。
原因是,现在 print 是 Python 3 中的一个函数,您可以覆盖它。因此,您可以在一个简单的脚本中随处使用 print,并决定需要写入哪些 print 语句stderr
。现在您可以重新定义 print 函数,甚至可以通过使用内置模块更改 print 函数来全局更改它。当然,file.write
您可以指定文件是什么,但通过覆盖 print,您还可以重新定义行分隔符或参数分隔符。
反过来说,也许你非常确定要写入stdout
,但也知道要将 print 更改为其他内容,你可以决定使用sys.stdout.write
,并使用 print 作为错误日志或其他内容。
因此,您使用什么取决于您打算如何使用它。print
更灵活,但这可能是使用它和不使用它的原因。 我仍然会选择灵活性,并选择打印。 另一个使用原因print
是熟悉。 更多人会知道您所说的打印是什么意思,而更少的人知道sys.stdout.write
。
解决方案 12:
在 Python 2 中,如果您需要传递函数,则可以将其赋值os.sys.stdout.write
给变量。您无法使用 (在REPL中)执行此操作print
。
>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>
一切按预期进行。
>>> cmd=print
File "<stdin>", line 1
cmd=print
^
SyntaxError: invalid syntax
那不起作用。print
是一个神奇的功能。
解决方案 13:
有哪些情况下 sys.stdout.write() 比打印更可取?
我发现在多线程情况下,stdout 比 print 效果更好。我使用队列 ( FIFO ) 来存储要打印的行,并在打印行之前保留所有线程,直到打印队列为空。即便如此,使用 print 时,我有时会在调试 I/O 上丢失最后的 \n(使用Wing Pro IDE)。
当我在字符串中使用带有 \n 的 std.out 时,调试 I/O 格式正确,并且 \n 也准确显示。
解决方案 14:
你问,
sys.stdout.write
和有什么区别
我知道最好的解释方法是向你展示如何print
用以下方式来写sys.stdout
下面我提供了三种不同的方法来实现python的print
功能:
实现1
import sys
def print(*args, sep=" ", file=sys.stdout, end="
") -> 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="
") -> 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="
") -> 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
解决方案 15:
有哪些情况下 sys.stdout.write() 比打印更可取?
例如,我正在开发一个小函数,在传递数字作为参数后,它会以金字塔格式打印星星,虽然您可以使用end=""在单独的行中打印来实现这一点,但我使用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)
解决方案 16:
当尝试将字节打印为十六进制形式时,其中一个区别如下。例如,我们知道的十进制值以十六进制形式255
出现0xFF
:
val = '{:02x}'.format(255)
sys.stdout.write(val) # Prints ff2
print(val) # Prints ff
扫码咨询,免费领取项目管理大礼包!