MyTetra Share
Делитесь знаниями!
The difference between sys.stdout.write and print?
Время создания: 16.07.2018 11:27
Текстовые метки: python stdout write print
Раздел: Python
Запись: Velonski/mytetra-database/master/base/153172246442207k23ig/text.html на raw.githubusercontent.com

Are there situations in which sys.stdout.write() is preferable to print?


(Examples: better performance; code that makes more sense)


python printing stdout

shareimprove this question

edited Nov 17 '17 at 16:55


martineau

60.6k785158

asked Jul 16 '10 at 9:53


Johanna Larsson

5,08132644

4

Which version of Python? 2.x or 3.x? – Mark Byers Jul 16 '10 at 9:54

Honestly I'd like to know for both, although I have no experience with Python 3. Updated the question. – Johanna Larsson Jul 16 '10 at 9:59

11

@S.Lott : asking for the basic differences between sys.stdout.write() and print (and/or why Python has both) is a perfectly reasonable question and does not need examples. OP did not say the command syntax was confusing. – smci Jan 20 '15 at 22:07

add a comment

8 Answers

active oldest votes

up vote

216

down vote

accepted

print is just a thin wrapper that formats the inputs (space between args and newline at the end) and calls the write function of a given object. By default this object is sys.stdout, but you can pass a file using the "chevron" form. For example:


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

See: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


In Python 3.x, print becomes a function, but it is still possible to pass something else than sys.stdout thanks to the fileargument.


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

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


In Python 2.6+, print is still a statement, but it can be used as a function with


from __future__ import print_function

Update: There is a little difference between the print function and the print statement (and more generally between a function and a statement) pointed by Bakuriu in comments.


In case of error when evaluating arguments:


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

shareimprove this answer

edited Feb 13 '17 at 7:43

answered Jul 16 '10 at 10:06


luc

24.9k1598148

35

It's also worth noting that print also appends a newline to whatever you write which doesn't happen with sys.stdout.write. – Michael Mior Jul 16 '10 at 11:49

@Michael Mior: True, I've said that "it formats the inputs". Better answser would mention what kind of formatting. Thanks for clarification. – luc Jul 16 '10 at 13:35

1

Also sys.stdout.write is more universal if you ever need to write dual-version code (e.g. code that works simultaneously with Python 2.x as well as Python 3.x). – andreb Dec 16 '10 at 3:28

2

@MichaelMior You can suppress the newline that print appends with a trailing comma: print "this",; print "on the same line as this" – drevicko Jun 14 '14 at 15:13

1

sys.stdout.write() also buffers the input and might not flush the input to the fd immediately. in order to make sure that it behaves like the print function, you should add: sys.stdout.flush() – kerbelp Nov 16 '17 at 7:27

show 3 more comments

up vote

108

down vote

"print" first converts the object to a string (if it is not already a string). It will also put a space before the object if it is not the start of a line and a newline character at the end.


When using stdout, you need to convert the object to a string yourself (by calling "str", for example) and there is no newline character.


So


print 99

is equivalent to:


import sys

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

shareimprove this answer

edited Jul 16 '10 at 10:22

answered Jul 16 '10 at 10:03


dogbane

179k57303367

25

+1 for mentioning the newline character! This is the main difference between print and .write(), I'd say. – Eric Lebigot Jul 16 '10 at 14:19

8

NOTE: print can be made to omit the newline. In Python 2.x, put a comma at the end, and a space character will be output, but no newline. E.g. print 99, In Python 3, print(..., end='') will avoid adding newline (and also avoid adding space, unless you do end=' '. – ToolmakerSteve Dec 19 '13 at 2:36

21

@EOL How funny is that, that someone named EOL makes a comment about '\n'... It made me laugh. I have no life. Kill me. – Depado Jun 23 '15 at 14:14

2

that's NOT true, print operation behaves slightly different in signal handlers in python2.X, i.e. print can not be replaced with sys.stdout in example: stackoverflow.com/questions/10777610/… – ddzialak Oct 27 '15 at 13:13

add a comment

up vote

30

down vote

My question is whether or not there are situations in which sys.stdout.write() is preferable to print


After finishing developing a script the other day, I uploaded it to a unix server. All my debug messages used print statements, and these do not appear on a server log.


This is a case where you may need sys.stdout.write instead.


shareimprove this answer

edited Sep 29 '12 at 15:17


Zearin

7471127

answered Jul 16 '10 at 10:59


LiamSullivan

43335

3

huh? Are you sure this is a difference between print() and sys.stdout.write(), as opposed to the difference between stdout and stderr? For debugging, you should use the logging module, which prints messages to stderr. – ostrokach Jan 25 '16 at 3:05

Ya. Same is true with using nohup and redirecting to a .out file. – conner.xyz May 9 '16 at 15:36

use of sys.stdout.flush() would help. – suprit chaudhary Jun 2 at 1:57

add a comment

up vote

27

down vote

Here's some sample code based on the book Learning Python by Mark Lutz that addresses your question:


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

Opening log.txt in a text editor will reveal the following:


testing123

another line

shareimprove this answer

edited Jun 18 '16 at 5:54


KeyWeeUsr

5,05181752

answered Aug 29 '12 at 16:43


Will Townes

8551915

Is there any way so that I can print to screen as well as write to the file? – Devesh Saini May 12 '14 at 4:15

4

@DeveshSaini: Yes, just overwrite sys.stdout with a proxy class that has at least a write() and flush() function. I wrote an example snippet here. – ponycat May 21 '14 at 9:08

add a comment

up vote

8

down vote

My question is whether or not there are situations in which sys.stdout.write() is preferable to print


If you're writing a command line application that can write to both files and stdout then it is handy. You can do things like:


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()

It does mean you can't use the with open(outfile, 'w') as out: pattern, but sometimes it is worth it.


shareimprove this answer

edited Jul 7 '13 at 22:00

answered Jul 7 '13 at 20:40


Hamish Downer

9,379107376

add a comment

up vote

7

down vote

There's at least one situation in which you want sys.stdout instead of print.


When you want to overwrite a line without going to the next line, for instance while drawing a progress bar or a status message, you need to loop over something like


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

And since print adds a newline, you are better off using sys.stdout.


shareimprove this answer

answered Aug 31 '16 at 15:24


Carlos

3,34553565

add a comment

up vote

3

down vote

In 2.x, the print statement preprocesses what you give it, turning it into strings along the way, handling separators and newlines, and allowing redirection to a file. 3.x turns it into a function, but it still has the same responsibilities.


sys.stdout is a file or file-like that has methods for writing to it which take strings or something along that line.


shareimprove this answer

answered Jul 16 '10 at 9:59


Ignacio Vazquez-Abrams

550k9310121118

add a comment

up vote

1

down vote

Are there situations in which sys.stdout.write() is preferable to print?


For example I'm working on small function which prints stars in pyramid format upon passing the number as argument, although you can accomplish this using end="" to print in a separate line, I used sys.stdout.write in co-ordination with print to make this work. To elaborate on this stdout.write prints in the same line where as print always prints its contents in a separate line.


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)

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования