Существуют ли ситуации, в которых sys.stdout.write()
предпочтительнее print
?
( Примеры: лучшая производительность, код, который имеет больше смысла)
Существуют ли ситуации, в которых sys.stdout.write()
предпочтительнее print
?
( Примеры: лучшая производительность, код, который имеет больше смысла)
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
print
сначала преобразует объект в строку (если это еще не строка). Он также будет ставить пробел перед объектом, если это не начало строки и символ новой строки в конце.
При использовании stdout
вам необходимо преобразовать объект в строку самостоятельно (например, вызвав "str"), а символ перевода строки отсутствует.
Так
print 99
эквивалентно:
import sys
sys.stdout.write(str(99) + '\n')
Мой вопрос в том, есть ли там это ситуации, в которых
sys.stdout.write()
предпочтительнее
После завершения разработки script на днях я загрузил его на unix-сервер. Все мои сообщения отладки использовали операторы print
, и эти не отображались в журнале сервера.
Это случай, когда вам может понадобиться sys.stdout.write
.
Вот пример кода, основанного на книге 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
Там по крайней мере одна ситуация, в которой вы хотите sys.stdout
вместо печати.
Если вы хотите переписать строку, не переходя к следующей строке, например при рисовании полосы выполнения или сообщения о статусе, вам нужно перебрать что-то вроде
Note carriage return-> "\rMy Status Message: %s" % progress
И так как печать добавляет новую строку, вам лучше использовать sys.stdout
.
Мой вопрос в том, есть ли ситуации, в которых
sys.stdout.write()
предпочтительнее
Если вы пишете приложение командной строки, которое может записывать оба файла и 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:
, но иногда это того стоит.
В 2.x оператор print
препроиздает то, что вы ему даете, превращая его в строки по пути, обрабатывая разделители и строки новой строки и разрешая перенаправление к файлу. 3.x превращает его в функцию, но у него все те же обязанности.
sys.stdout
является файлом или файлом, который имеет методы для записи в него, которые берут строки или что-то в этом направлении.
Существуют ли ситуации, когда 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)
В каких ситуациях предпочтительнее печатать sys.stdout.write()?
Я обнаружил, что стандартный вывод работает лучше, чем печать в многопоточном режиме. Я использую очередь (FIFO), чтобы сохранить строки для печати, и держу все нити перед строкой печати, пока моя печать Q не станет пустой. Тем не менее, при использовании print я иногда теряю финал \n при отладочном вводе-выводе (используя wing pro IDE).
Когда я использую std.out с \n в строке, отладочный ввод-вывод форматируется правильно, и \n отображаются точно.
В 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
.
предпочтительно, когда динамическая печать полезна, например, для предоставления информации в длительном процессе:
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)
>>> 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
не будет писать sys.stdout.write
объект, но print
будет
sys.stdout.write
не будет добавлять символ новой строки в конце, но print
будет
Если мы погрузимся глубоко,
sys.stdout
- это файловый объект, который можно использовать для вывода print()
если аргумент файла print()
не указан, будет использован sys.stdout
Одно из различий заключается в следующем, когда вы пытаетесь напечатать байт в его шестнадцатеричном виде. Например, мы знаем, что десятичное значение 255
равно 0xFF
в шестнадцатеричном виде:
val = '{:02x}'.format(255)
sys.stdout.write(val) # prints ff2
print(val) # prints ff