Разница между sys.stdout.write и печатью?

Существуют ли ситуации, в которых 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

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

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

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception

print("something", 1/0, "other") #does not print anything. The function is not called

Ответ 2

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

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

Так

print 99

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

import sys
sys.stdout.write(str(99) + '\n')

Ответ 3

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

После завершения разработки script на днях я загрузил его на unix-сервер. Все мои сообщения отладки использовали операторы print, и эти не отображались в журнале сервера.

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

Ответ 4

Вот пример кода, основанного на книге 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 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

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

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

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

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

Ответ 6

Мой вопрос в том, есть ли ситуации, в которых 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

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

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

Ответ 8

Существуют ли ситуации, когда sys.stdout.write() предпочтительнее печать?

Например, я работаю над небольшой функцией, которая печатает звезды в формате пирамиды при передаче числа в качестве аргумента, хотя вы можете выполнить это с помощью end = "" для печати в отдельной строке, я используйте sys.stdout.write в координации с печать, чтобы сделать эту работу. Чтобы выработать этот вывод 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

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

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

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

Ответ 10

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

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

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

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

Ответ 11

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

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)

Ответ 12

>>> 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 не будет писать sys.stdout.write объект, но print будет

  2. sys.stdout.write не будет добавлять символ новой строки в конце, но print будет

Если мы погрузимся глубоко,

sys.stdout - это файловый объект, который можно использовать для вывода print()

если аргумент файла print() не указан, будет использован sys.stdout

Ответ 13

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

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

sys.stdout.write(val) # prints ff2
print(val)            # prints ff