代码之家  ›  专栏  ›  技术社区  ›  Johanna Larsson

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

  •  311
  • Johanna Larsson  · 技术社区  · 15 年前

    有没有这样的情况 sys.stdout.write() 最好是 print ?

    ( 实例: 更好的性能;更合理的代码)

    11 回复  |  直到 15 年前
        1
  •  251
  •   naught101 Ari B. Friedman    6 年前

    print 只是一个精简包装器,用于格式化输入(可修改,但默认情况下在参数和换行符之间有一个空格)并调用给定对象的写入函数。默认情况下,此对象是 sys.stdout 但您可以使用“chevron”表单传递文件。例如:

    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中, 打印 成为一个函数,但仍然可以传递除 Sy.StdOUT 多亏了 file 争论。

    print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
    

    https://docs.python.org/3/library/functions.html#print


    在Python 2.6 +中, 打印 仍然是语句,但它可以用作

    from __future__ import print_function
    

    更新:在注释中,print函数和bakuriu所指的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
    
        2
  •  127
  •   Sociopath    6 年前

    print 首先将对象转换为字符串(如果它不是字符串)。如果对象不是一行的开头,并且结尾不是换行符,那么它还将在对象前面放置一个空格。

    使用时 stdout ,您需要自己将对象转换为字符串(例如,通过调用“str”),并且没有换行符。

    所以

    print 99
    

    相当于:

    import sys
    sys.stdout.write(str(99) + '\n')
    
        3
  •  36
  •   Zearin lifeisstillgood    12 年前

    我的问题是是否在那里 在什么情况下 sys.stdout.write() 最好是 print

    前几天完成脚本开发后,我把它上传到了一个Unix服务器上。使用的所有调试消息 打印 声明,以及这些 出现在服务器日志中。

    这是你可能需要的情况 sys.stdout.write 相反。

        4
  •  32
  •   Peter Badida I'm Geeker    9 年前

    这是一些基于这本书的示例代码 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
    
        5
  •  9
  •   Carlos    8 年前

    至少有一种情况是你想要的 sys.stdout 而不是印刷品。

    例如,当您想覆盖一行而不转到下一行时 绘制进度条或状态消息时 ,您需要循环

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

    既然print添加了新行,你最好使用 Sy.StdOUT .

        6
  •  8
  •   Hamish Downer JKP    12 年前

    我的问题是是否存在这样的情况 sys.stdout.write() 最好是 print

    如果您正在编写一个命令行应用程序,它可以同时写入文件和stdout,那么它很方便。你可以这样做:

    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: 模式,但有时是值得的。

        7
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

    在2。x, print 语句预处理您提供的内容,将其转换为字符串,处理分隔符和换行符,并允许重定向到文件。3.x把它变成一个函数,但它仍然有相同的职责。

    sys.stdout 是一个文件或类似的文件,它有一些方法来写入它,这些方法在这一行中使用字符串或其他东西。

        8
  •  1
  •   Sreedhar Danturthi    7 年前

    在某些情况下,sys.stdout.write()优于 打印?

    例如,我正在研究一个小函数,它在将数字作为参数传递时以金字塔格式打印星星,尽管您可以使用 结束=“ 为了单独打印,我使用 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)
    
        9
  •  1
  •   David Poundall    6 年前

    在某些情况下,sys.stdout.write()优于打印?

    我发现在多线程情况下,stdout比print更有效。我使用队列(FIFO)来存储要打印的行,并在打印行之前保留所有线程,直到打印Q为空。即使如此,使用print有时也会丢失调试I/O的\n最终结果(使用wing pro-ide)。

    当我在字符串中与\n一起使用std.out时,调试I/O格式正确,并且\n的正确显示。

        10
  •  1
  •   Hielke Walinga    6 年前

    在python 3中,使用print over是有正当理由的 sys.stdout.write 但是这个理由也可以变成使用的理由 sys.stdout.write(系统标准输出写入) 相反。

    这是因为,现在print是python 3中的一个函数,您可以覆盖它。因此,您可以在一个简单的脚本中使用print everywhere,并决定这些print语句需要写入 stderr 相反。现在您可以重新定义打印函数,甚至可以使用内置模块更改打印函数全局。偏离航向 file.write 您可以指定文件,但通过覆盖打印,您还可以重新定义行分隔符或参数分隔符。

    另一个方法是。也许你肯定你写信给 stdout ,但也要知道您要将打印更改为其他内容,您可以决定使用 sys.stdout.write(系统标准输出写入) ,并使用“打印”作为错误日志或其他内容。

    所以,你使用什么取决于你打算如何使用它。 print 更灵活,但这可能是使用和不使用的原因。我还是会选择灵活性,然后选择打印。使用的另一个原因 打印 而是熟悉。现在会有更多的人了解你所说的印刷品,而更少的人知道你所说的印刷品。 sys.stdout.write(系统标准输出写入) .

        11
  •  1
  •   Shivid    6 年前

    例如,当动态打印很有用时,最好在长时间内提供信息:

    import time, sys
    Iterations = 555
    for k in range(Iterations+1):
        # some code to execute here ...
        percentage = k / Iterations
        time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
        sys.stdout.write(time_msg)
        sys.stdout.flush()
        time.sleep(0.01)