Gibt es Situationen, in denen sys.stdout.write()
zu print
vorzuziehen ist?Der Unterschied zwischen sys.stdout.write und drucken?
(Beispiele: eine bessere Leistung, Code, der mehr Sinn macht)
Gibt es Situationen, in denen sys.stdout.write()
zu print
vorzuziehen ist?Der Unterschied zwischen sys.stdout.write und drucken?
(Beispiele: eine bessere Leistung, Code, der mehr Sinn macht)
print
ist nur eine dünne Hülle, die die Eingänge (Raum zwischen args und Neue-Zeile am Ende) formatiert und ruft die Schreibfunktion von a gegebenes Objekt. Standardmäßig ist dieses Objekt sys.stdout
, aber Sie können eine Datei mit dem Formular "chevron" übergeben. Zum Beispiel:
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 wird print
eine Funktion, aber es ist immer noch möglich, etwas anderes als sys.stdout
dank der file
Argument übergeben.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
Siehe https://docs.python.org/3/library/functions.html#print
In Python 2.6+, print
noch eine Aussage ist, aber es kann mit
from __future__ import print_function
-Update als Funktion verwendet werden: Es gibt ein kleiner Unterschied zwischen der Druckfunktion und der Druckanweisung (und allgemeiner zwischen einer Funktion und als von Bakuriu in Kommentaren.
Im Fehlerfall, wenn Argumente der Bewertung:
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
Es ist auch erwähnenswert, dass ' print 'hängt auch eine neue Zeile an was auch immer Sie schreiben, was nicht mit' sys.stdout.write' geschieht. –
@Michael Mior: Richtig, ich habe gesagt, dass "es die Eingaben formatiert." Bessere Antworten würden erwähnen, was für Danke für die Klarstellung – luc
Auch 'sys.stdout.write' ist universeller, wenn Sie jemals Dual-Versi schreiben müssen auf Code (z.B. Code, der gleichzeitig mit Python 2.x und Python 3.x funktioniert. – andreb
In 2.x, die print
Anweisung vorverarbeitet, was Sie geben es, verwandelte sie in Zeichenfolgen auf dem Weg, Umgang mit Separatoren und Zeilenumbrüche und Erlaube Umleitung zu einer Datei. 3.x macht es zu einer Funktion, aber es hat immer noch die gleichen Verantwortlichkeiten.
sys.stdout
ist eine Datei oder Datei-ähnliche, die Methoden zum Schreiben hat, die Zeichenfolgen oder etwas entlang dieser Linie nehmen.
"print" konvertiert das Objekt zuerst in einen String (wenn es nicht bereits ein String ist). Es wird auch ein Leerzeichen vor dem Objekt eingefügt, wenn es nicht der Anfang einer Zeile und ein Zeilenvorschubzeichen am Ende ist.
Wenn stdout verwenden, müssen Sie das Objekt in einen String selbst konvertieren (durch „str“, zum Beispiel Aufruf) und es gibt keine Newline-Zeichen.
So
print 99
entspricht:
import sys
sys.stdout.write(str(99) + '\n')
+1 für die Erwähnung des Newline-Charakters! Dies ist der Hauptunterschied zwischen 'print' und' .write() ', würde ich sagen. – EOL
HINWEIS: Mit 'print' kann der Zeilenumbruch wegfallen. Fügen Sie in Python 2.x am Ende ein Komma ein, und ein Leerzeichen wird ausgegeben, aber keine Zeilenschaltung. Z.B. 'print 99,' In Python 3 wird 'print (..., end = '')' vermeiden, Zeilenumbrüche hinzuzufügen (und auch das Hinzufügen von Leerzeichen zu vermeiden, es sei denn, Sie tun 'end =' ''. – ToolmakerSteve
@EOL Wie lustig ist das? , dass jemand namens EOL einen Kommentar über '\ n' macht ... Es hat mich zum Lachen gebracht. Ich habe kein Leben. Töte mich. – Depado
Meine Frage ist, ob es Situationen gibt, in denen
sys.stdout.write()
zu vorzuziehen ist
Nach Abschluss der Entwicklung eines Skript neulich, ich habe es auf einen Unix-Server hochgeladen. Alle meine Debug-Nachrichten verwendet print
Anweisungen, und diese nicht erscheinen auf einem Serverprotokoll.
Dies ist ein Fall, in dem Sie stattdessen sys.stdout.write
benötigen.
huh? Sind Sie sicher, dass dies ein Unterschied zwischen 'print()' und 'sys.stdout.write()' ist, im Gegensatz zu dem Unterschied zwischen 'stdout' und' stderr'? Zum Debuggen sollten Sie das Modul 'logging' verwenden, das Nachrichten an' stderr' druckt. – ostrokach
Ya. Gleiches gilt für die Verwendung von 'nohup' und das Umleiten zu einer' .out' Datei. –
Hier ist ein Beispielcode basiert auf dem Buch Learning Python von Mark Lutz, die Ihre Frage befasst:
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
Eröffnung log.txt in einem Texteditor die folgenden wird zeigen:
testing123
another line
Gibt es eine Möglichkeit, so dass ich auf dem Bildschirm drucken sowie in die Datei schreiben kann? –
@DeveshSaini: Ja, überschreiben Sie einfach sys.stdout mit einer Proxy-Klasse, die mindestens eine write() und flush() Funktion hat. Ich habe ein Beispiel-Snippet [hier] geschrieben (http://hastebin.com/owijihizus.py). – ponycat
Meine Frage ist, ob es Situationen gibt, in denen
vorzuziehen ist oder nichtsys.stdout.write()
zu
Wenn Sie eine Befehlszeilenanwendung schreiben, die sowohl in Dateien als auch in stdout schreiben kann, ist es praktisch. Sie können Dinge wie:
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()
Es bedeutet aber nicht das with open(outfile, 'w') as out:
Muster verwenden können, aber manchmal ist es das wert.
Es gibt mindestens eine Situation, in der Sie sys.stdout
statt drucken möchten.
Wenn Sie eine Zeile überschrieben werden soll, ohne auf die nächste Zeile zu gehen, zum Beispiel während ein Fortschrittsbalken oder eine Statusmeldung Zeichnung, müssen Sie eine Schleife über so etwas wie
Note carriage return-> "\rMy Status Message: %s" % progress
Und da machen Drucken ein Newline, Sie sind besser dran mit sys.stdout
.
Gibt es Situationen, in denen sys.stdout.write() besser ist als drucken?
Zum Beispiel ist ich auf kleine Funktion arbeiten, die Sterne in Pyramidenformat druckt auf die Zahl als Argument übergeben, obwohl Sie diese mit Ende „erreichen können =“ in einer separaten Zeile zu drucken, I verwendet sys.stdout.write in Abstimmung mit Drucken, um diese Arbeit zu machen. Um dies zu präzisieren stdout.Schreiben Sie druckt in der gleichen Zeile wo Drucken immer druckt seinen Inhalt in einer separaten Zeile.
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)
Welche Version von Python? 2.x oder 3.x? –
Ehrlich gesagt würde ich gerne für beide wissen, obwohl ich keine Erfahrung mit Python 3 habe. Aktualisiert die Frage. –
@ S.Lott: nach den grundlegenden Unterschieden zwischen 'sys.stdout.write()' und 'print' zu fragen (und/oder warum Python beides hat) ist eine vollkommen vernünftige Frage und benötigt keine Beispiele. OP sagte nicht, dass die Befehlssyntax verwirrend sei. – smci