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

2025-03-04 08:24:00
admin
原创
85
摘要:问题描述:有哪些情况比sys.stdout.write()更可取print?(例如:更好的性能;更有意义的代码)解决方案 1:print只是一个薄包装器,用于格式化输入(可修改,但默认情况下在参数和末尾的换行符之间有一个空格)并调用给定对象的写入函数。默认情况下,此对象是sys.stdout,但您可以使用“人...

问题描述:

有哪些情况比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()更好的
情况print

前几天开发完一个脚本后,我将其上传到 unix 服务器。我的所有调试消息都使用了print语句,而这些语句不会出现在服务器日志中。

这是一个您可能需要的情况sys.stdout.write

解决方案 5:

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

当你想覆盖某一行而不转到下一行时,例如在绘制进度条或状态消息时,你需要循环执行类似的操作

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

而且由于 print 添加了换行符,因此最好使用sys.stdout

解决方案 6:

我的问题是,是否存在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 + '
')
        # ...
    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

观察上面的例子:

  1. sys.stdout.write不会写非字符串对象,但print

  2. 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?`

我知道最好的解释方法是向你展示如何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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用