Gibt es Situationen, in denen sys.stdout.write()
ist vorzuziehen gegenüber print
?
( Beispiele: bessere Leistung; sinnvollerer Code)
Gibt es Situationen, in denen sys.stdout.write()
ist vorzuziehen gegenüber print
?
( Beispiele: bessere Leistung; sinnvollerer Code)
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
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')
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
Meine Frage ist, ob es Situationen gibt, in denen
sys.stdout.write()
ist vorzuziehen gegenüber
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.
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 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.
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()
yprint
(bzw. warum Python beides hat), ist eine durchaus berechtigte Frage und braucht keine Beispiele. Der Auftraggeber hat nicht gesagt, dass die Befehlssyntax verwirrend ist.