webentwicklung-frage-antwort-db.com.de

Überschreibt die vorherige Ausgabe in Jupyter Notebook

Nehmen wir an, ich habe einen Teil des Codes, der für eine bestimmte Zeitspanne ausgeführt wird, und jede Sekunde gibt etwa Folgendes aus: iteration X, score Y. Ich werde diese Funktion durch meine Blackbox-Funktion ersetzen:

from random import uniform
import time

def black_box():
    i = 1
    while True:
        print 'Iteration', i, 'Score:', uniform(0, 1)
        time.sleep(1)
        i += 1

Wenn ich es jetzt in Jupyter-Notizbuch starte, wird nach jeder Sekunde eine neue Zeile ausgegeben:

Iteration 1 Score: 0.664167449844
Iteration 2 Score: 0.514757592404
...

Ja, wenn die Ausgabe zu groß wird, kann der HTML-Code gescrollt werden, aber ich brauche keine dieser Zeilen außer der letzten. Anstatt also n Zeilen nach n Sekunden zu haben, möchte ich nur 1 Zeile (die letzte) angezeigt.

Ich habe so etwas nicht in der Dokumentation oder in der Durchsicht von Magie gefunden. Eine Frage mit fast demselben Titel, aber irrelevant.

23
Salvador Dali

@cel ist richtig: ipython notebook clear cell output in code

Wenn Sie clear_output () benutzen, hat Ihr Notebook allerdings einige Probleme. Ich empfehle auch die Funktion display () wie folgt zu verwenden (Python 2.7):

from random import uniform
import time
from IPython.display import display, clear_output

def black_box():
i = 1
while True:
    clear_output(wait=True)
    display('Iteration '+str(i)+' Score: '+str(uniform(0, 1)))
    time.sleep(1)
    i += 1
31
DangerousDave

Der übliche (dokumentierte) Weg, um das zu tun, was Sie beschreiben (das funktioniert nur mit Python 3)), ist:

print('Iteration', i, 'Score:', uniform(0, 1), end='\r')

In Python 2 müssen wir nach dem Ausdruck sys.stdout.flush(), wie in diesem Beispiel gezeigt answer :

print('Iteration', i, 'Score:', uniform(0, 1), end='\r')
sys.stdout.flush()

Mit IPython Notebook musste ich die Zeichenfolge verketten, damit es funktioniert:

print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r')

Und zum Schluss habe ich Folgendes verwendet, damit es mit Jupyter funktioniert:

print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='')

Oder Sie können die prints vor und nach dem time.sleep Aufteilen, wenn es sinnvoller ist, oder Sie müssen genauer sein:

print('Iteration', i, 'Score:', uniform(0, 1), end='')
time.sleep(1)
print('', end='\r') # or even print('\r', end='')
14
chapelo