2010-07-16 8 views
236

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)

+4

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

+0

Ehrlich gesagt würde ich gerne für beide wissen, obwohl ich keine Erfahrung mit Python 3 habe. Aktualisiert die Frage. –

+9

@ 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

Antwort

197

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 
+28

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. –

+0

@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

+0

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

2

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.

98

"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') 
+23

+1 für die Erwähnung des Newline-Charakters! Dies ist der Hauptunterschied zwischen 'print' und' .write() ', würde ich sagen. – EOL

+7

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

+16

@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

30

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

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.

+1

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

+0

Ya. Gleiches gilt für die Verwendung von 'nohup' und das Umleiten zu einer' .out' Datei. –

23

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 
+0

Gibt es eine Möglichkeit, so dass ich auf dem Bildschirm drucken sowie in die Datei schreiben kann? –

+3

@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

8

Meine Frage ist, ob es Situationen gibt, in denen sys.stdout.write() zu print

vorzuziehen ist oder nicht

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.

5

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.

0

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) 
Verwandte Themen