Есть ли ситуации, в которых sys.stdout.write() предпочтительнее print?

( Примеры: лучшая производительность; более понятный код)

414
Johanna Larsson 16 Июл 2010 в 13:53

14 ответов

Лучший ответ

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#. печать


В Python 2.6+ print по-прежнему является оператором, но его можно использовать как функцию с

from __future__ import print_function

Обновление: Бакуриу прокомментировал, что указал на небольшую разницу между функцией печати и оператором печати (и, в более общем смысле, между функцией и оператором).

В случае ошибки при оценке аргументов:

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
284
Craig 17 Май 2019 в 20:57

Есть ли ситуации, в которых 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)
1
Sree 23 Авг 2017 в 11:01

В 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

Это не работает. Печать это магическая функция.

0
shanecandoit 23 Янв 2020 в 17:25

Одно из различий заключается в следующем, когда вы пытаетесь напечатать байт в его шестнадцатеричном виде. Например, мы знаем, что десятичное значение 255 равно 0xFF в шестнадцатеричном виде:

val = '{:02x}'.format(255) 

sys.stdout.write(val) # prints ff2
print(val)            # prints ff
1
typelogic 28 Сен 2019 в 15:03

Мой вопрос: есть или нет ситуации, в которых sys.stdout.write() предпочтительнее print

Закончив разработку скрипта на днях, я загрузил его на сервер Unix. Все мои сообщения отладки использовали операторы print, и эти не появляются в журнале сервера.

Это тот случай, когда вам может понадобиться sys.stdout.write вместо этого.

41
Zearin 29 Сен 2012 в 15:17

print сначала преобразует объект в строку (если это еще не строка). Он также будет ставить пробел перед объектом, если он не является началом строки и символом новой строки в конце.

При использовании stdout вам необходимо самостоятельно преобразовать объект в строку (например, вызвав «str»), а символ перевода строки отсутствует.

Так

print 99

Эквивалентно:

import sys
sys.stdout.write(str(99) + '\n')
143
AkshayNevrekar 5 Фев 2019 в 10:03
>>> 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

1
GraceMeng 18 Июл 2019 в 17:19

Есть по крайней мере одна ситуация, в которой вы хотите sys.stdout вместо печати.

Если вы хотите перезаписать строку, не переходя к следующей строке, например при рисовании индикатора выполнения или сообщения о состоянии , вам нужно перебрать что-то вроде

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

А так как print добавляет новую строку, вам лучше использовать sys.stdout.

14
Carlos 31 Авг 2016 в 15:24

В 2.x оператор print предварительно обрабатывает то, что вы ему даете, превращая его в строки по пути, обрабатывая разделители и символы новой строки и разрешая перенаправление в файл. 3.x превращает его в функцию, но у него все те же обязанности.

sys.stdout - это файл или файл, который имеет методы для записи в него, которые принимают строки или что-то подобное.

4
Ignacio Vazquez-Abrams 16 Июл 2010 в 09:59

У меня вопрос, есть ли ситуации, в которых 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:, но иногда оно того стоит.

8
Hamish Downer 7 Июл 2013 в 22:00

Предпочтительно, когда динамическая печать полезна, например, для предоставления информации в длительном процессе:

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)
3
Hamidreza 26 Окт 2018 в 08:38

В Python 3 есть веская причина использовать print over sys.stdout.write, но эту причину также можно превратить в причину для использования sys.stdout.write.

Это объясняется тем, что теперь печать является функцией в Python 3, вы можете переопределить это. Таким образом, вы можете использовать print везде в простом сценарии и решить, что эти операторы печати должны записывать в stderr. Теперь вы можете просто переопределить функцию печати, вы даже можете изменить глобальную функцию печати, изменив ее с помощью встроенного модуля. Конечно, с помощью file.write вы можете указать, что это за файл, но с помощью перезаписи печати вы также можете переопределить разделитель строк или разделитель аргументов.

И наоборот. Возможно, вы абсолютно уверены, что пишете в stdout, но также знаете, что собираетесь изменить печать на что-то другое, вы можете решить использовать sys.stdout.write и использовать печать для журнала ошибок или чего-то еще.

Итак, что вы используете, зависит от того, как вы собираетесь его использовать. print более гибок, но это может быть причиной, чтобы использовать его и не использовать. Я бы все равно выбрал гибкость и выбрал печать. Еще одна причина использовать print вместо этого - знакомство. Больше людей теперь поймут, что вы подразумеваете под печатью, и меньше знают sys.stdout.write.

1
Hielke Walinga 25 Окт 2018 в 11:23

Есть ли ситуации, в которых sys.stdout.write () предпочтительнее печатать?

Я обнаружил, что стандартный вывод работает лучше, чем печать в многопоточном режиме. Я использую очередь (FIFO), чтобы сохранить строки для печати, и держу все нити перед строкой печати, пока моя печать Q не станет пустой. Тем не менее, при использовании print я иногда теряю финал \ n при отладочном вводе-выводе (используя wing pro IDE).

Когда я использую std.out с \ n в строке, отладочный ввод-вывод форматируется правильно, и \ n точно отображаются.

1
David Poundall 4 Сен 2018 в 07:45

Вот пример кода, основанного на книге Марка Лутца 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
36
KeyWeeUsr 18 Июн 2016 в 05:54