516 Stimmen

Der Unterschied zwischen sys.stdout.write und print?

Gibt es Situationen, in denen sys.stdout.write() ist vorzuziehen gegenüber print ?

( Beispiele: bessere Leistung; sinnvollerer Code)

6 Stimmen

Welche Version von Python? 2.x oder 3.x?

0 Stimmen

Ehrlich gesagt würde ich gerne beides wissen, obwohl ich keine Erfahrung mit Python 3 habe. Habe die Frage aktualisiert.

29 Stimmen

@S.Lott : Frage nach den grundlegenden Unterschieden zwischen sys.stdout.write() y print (bzw. warum Python beides hat), ist eine durchaus berechtigte Frage und braucht keine Beispiele. Der Auftraggeber hat nicht gesagt, dass die Befehlssyntax verwirrend ist.

367voto

luc Punkte 39730

print ist nur ein dünner Wrapper, der die Eingaben formatiert (änderbar, aber standardmäßig mit einem Leerzeichen zwischen args und einem Zeilenumbruch am Ende) und die Schreibfunktion eines bestimmten Objekts aufruft. Standardmäßig ist dieses Objekt sys.stdout aber Sie können eine Datei in der "Chevron"-Form übergeben. Zum Beispiel:

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

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


In Python 3.x, print wird zu einer Funktion, aber es ist immer noch möglich, etwas anderes zu übergeben als sys.stdout dank der file Argument.

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

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


In Python 2.6+, print ist immer noch eine Anweisung, aber sie kann als Funktion verwendet werden mit

from __future__ import print_function

Update: Bakuriu wies darauf hin, dass es einen kleinen Unterschied zwischen der Funktion print und der Anweisung print (und allgemeiner zwischen einer Funktion und einer Anweisung) gibt.

Im Falle eines Fehlers bei der Auswertung der Argumente:

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

188voto

dogbane Punkte 253146

print wandelt das Objekt zunächst in eine Zeichenkette um (falls es nicht bereits eine Zeichenkette ist). Außerdem wird vor dem Objekt ein Leerzeichen eingefügt, wenn es nicht der Anfang einer Zeile ist, und am Ende ein Zeilenumbruchzeichen.

Bei der Verwendung von stdout müssen Sie das Objekt selbst in eine Zeichenkette umwandeln (z. B. durch den Aufruf von "str"), und es gibt kein Zeilenumbruchzeichen.

Also

print 99

ist gleichbedeutend mit:

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

52voto

Will Townes Punkte 1677

Hier ist ein Beispielcode, der auf dem Buch basiert Python lernen von Mark Lutz, der Ihre Frage beantwortet:

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

Wenn Sie die Datei log.txt in einem Texteditor öffnen, sehen Sie Folgendes:

testing123
another line

41voto

LiamSullivan Punkte 615

Meine Frage ist, ob es Situationen gibt, in denen sys.stdout.write() ist vorzuziehen gegenüber print

Nachdem ich neulich ein Skript entwickelt hatte, lud ich es auf einen Unix-Server hoch. Alle meine Debug-Meldungen verwendeten print Aussagen, und diese nicht in einem Serverprotokoll erscheinen.

Dies ist ein Fall, in dem Sie möglicherweise Folgendes benötigen sys.stdout.write stattdessen.

18voto

Carlos Punkte 5763

Es gibt mindestens eine Situation, in der Sie sys.stdout anstelle von Druck.

Wenn Sie eine Zeile überschreiben wollen, ohne in die nächste Zeile zu gehen, zum Beispiel beim Zeichnen eines Fortschrittsbalkens oder einer Statusmeldung müssen Sie eine Schleife über etwas wie

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

Und da print einen Zeilenumbruch hinzufügt, ist es besser, wenn Sie sys.stdout .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X