Wenn ich den folgenden Code hätte:
for x in range(10):
print x
Ich würde die Ausgabe von bekommen
1
2
etc..
Anstatt eine neue Zeile zu drucken, möchte ich den vorherigen Wert ersetzen und ihn durch den neuen Wert in derselben Zeile überschreiben.
Antworten:
Eine Möglichkeit besteht darin, das
'\r'
Zeichen carriage return ( ) zu verwenden, um zum Zeilenanfang zurückzukehren, ohne zur nächsten Zeile überzugehen:Das Komma am Ende der print-Anweisung weist darauf hin, dass nicht in die nächste Zeile gewechselt werden soll. Die letzte Druckanweisung geht zur nächsten Zeile über, damit Ihre Eingabeaufforderung Ihre endgültige Ausgabe nicht überschreibt.
Aktualisieren
Jetzt, da Python 2 EOL ist, ist eine Python 3-Antwort sinnvoller. Für Python 3.5 und früher:
In Python 3.6 und höher lesen sich F-Strings besser:
quelle
%
Bediener ist veraltet. Grundsätzlich haben alle Zeichenfolgen jetzt eine Formatierungsmethode . In diesem Fall{0}
bedeutet das "das erste Argument fürformat()
" (die Zählung beginnt bei 0).re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
, erhalten Sie die richtige Zeichenfolge zum Löschen bis zum Zeilenende für jedes Terminal, über das der Benutzer verfügt. Denken Sie daran,curses
mit etwas wie zu initialisierencurses.setupterm(fd=sys.stdout.fileno())
undsys.stdout.isatty()
sicherzustellen, dass Ihre Ausgabe nicht in eine Datei umgeleitet wird. Unter code.activestate.com/recipes/475116 finden Sie ein vollständiges Python-Modul mit Cursorsteuerung und Farbunterstützung.import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
Sie Folgendes: Es sollten die Hex-Codes der Zeichenfolge gedruckt werden, um zum Zeilenanfang zu gelangen.Da ich über Google hier gelandet bin, aber Python 3 verwende, würde dies in Python 3 folgendermaßen funktionieren:
Verwandte Antwort hier: Wie kann ich den Zeilenumbruch nach einer Druckanweisung unterdrücken?
quelle
testing
und Ihr zweiter Schleifendrucktest
die Ausgabe nach dem zweiten Durchgang weiterhin sindtesting
- jetzt sehe ich, dass @ Nagasaki45 darauf hingewiesen hatprint("\r", message, end="")
@ Mike DeSimone Antwort wird wahrscheinlich die meiste Zeit funktionieren. Aber...
Das liegt daran, dass die
'\r'
einzige nur zum Zeilenanfang zurückkehrt, aber die Ausgabe nicht löscht.EDIT: Bessere Lösung (als mein alter Vorschlag unten)
Wenn Ihnen die POSIX-Unterstützung ausreicht, wird die aktuelle Zeile durch Folgendes gelöscht und der Cursor am Anfang belassen:
Es verwendet ANSI-Escape-Code, um die Terminalleitung zu löschen. Weitere Informationen finden Sie in Wikipedia und in diesem großartigen Vortrag .
Alte Antwort
Die (nicht so gute) Lösung, die ich gefunden habe, sieht folgendermaßen aus:
Ein Vorteil ist, dass es auch unter Windows funktioniert.
quelle
Ich hatte die gleiche Frage, bevor ich diesen Thread besuchte. Für mich hat das sys.stdout.write nur funktioniert, wenn ich den Puffer richtig geleert habe, dh
Ohne Leeren wird das Ergebnis nur am Ende des Skripts gedruckt
quelle
stringvar.ljust(10,' ')
bei Zeichenfolgen mit variabler Länge.Unterdrücken Sie die Newline und drucken Sie
\r
.oder schreiben Sie an stdout:
quelle
Versuche dies:
Es hat bei mir funktioniert. Der
end="\r"
Teil bewirkt, dass die vorherige Zeile überschrieben wird.WARNUNG!
Wenn Sie ausdrucken
hi
, dann ausdruckenhello
verwenden\r
, die Sie erhalten ,hillo
weil die Ausgabe die letzten beiden Buchstaben schrieb über. Wenn Siehi
mit Leerzeichen drucken (die hier nicht angezeigt werden), wird dies ausgegebenhi
. Um dies zu beheben, drucken Sie Leerzeichen mit aus\r
.quelle
Hi BobHi BobHi BobHi BobHi Bob
. Python 3.7.1\r
am Anfang statt am Ende ist.Ich konnte keine der Lösungen auf dieser Seite für IPython verwenden , aber eine geringfügige Abweichung von der Lösung von @ Mike-Desimone hat den Job erledigt: Anstatt die Zeile mit dem Wagenrücklauf zu beenden, beginnen Sie die Zeile mit dem Wagenrücklauf:
Darüber hinaus erfordert dieser Ansatz nicht die zweite Druckanweisung.
quelle
time.sleep (0.5) zeigt an, wie die vorherige Ausgabe gelöscht und die neue Ausgabe "\ r" gedruckt wird, wenn zu Beginn der Drucknachricht die vorherige Ausgabe vor der neuen Ausgabe gelöscht wird.
quelle
Dies funktioniert unter Windows und Python 3.6
quelle
Die akzeptierte Antwort ist nicht perfekt . Die Zeile, die zuerst gedruckt wurde, bleibt dort und wenn Ihr zweiter Druck nicht die gesamte neue Zeile abdeckt, erhalten Sie Mülltext.
Um das Problem zu veranschaulichen, speichern Sie diesen Code als Skript und führen Sie ihn aus (oder werfen Sie einen Blick darauf):
Die Ausgabe sieht ungefähr so aus:
Was für mich funktioniert, ist, die Zeile zu löschen, bevor ich einen dauerhaften Druck hinterlasse. Sie können sich jederzeit an Ihr spezifisches Problem anpassen:
Und jetzt wird wie erwartet gedruckt:
quelle
Hier ist eine sauberere, "Plug-and-Play" -Version der Antwort von @ Nagasaki45. Im Gegensatz zu vielen anderen Antworten funktioniert es ordnungsgemäß mit Zeichenfolgen unterschiedlicher Länge. Dies wird erreicht, indem die Zeile mit genau so vielen Leerzeichen gelöscht wird wie die Länge der zuletzt gedruckten Zeile. Funktioniert auch unter Windows.
Verwendung
Verwenden Sie es einfach so:
Dieser kleine Test zeigt, dass Linien auch für unterschiedliche Längen richtig gelöscht werden:
quelle
Ich bin ein bisschen überrascht, dass niemand das Backspace-Zeichen verwendet. Hier ist eine, die es verwendet.
quelle
sys.stdout.flush()
(Python3) Das hat bei mir funktioniert. Wenn Sie nur \ 010 verwenden, bleiben Zeichen übrig, daher habe ich es ein wenig optimiert, um sicherzustellen, dass es überschreibt, was dort war. Auf diese Weise können Sie auch etwas vor dem ersten Druckelement haben und nur die Länge des Elements entfernen.
quelle
Eine weitere Antwort basierend auf den vorherigen Antworten.
Inhalt von pbar.py: import sys, shutil, datetime
Verwendung des Skripts:
quelle
Hier ist meine Lösung! Windows 10, Python 3.7.1
Ich bin nicht sicher, warum dieser Code funktioniert, aber er löscht die ursprüngliche Zeile vollständig. Ich habe es aus den vorherigen Antworten zusammengestellt. Die anderen Antworten würden die Zeile nur an den Anfang zurückbringen, aber wenn Sie danach eine kürzere Zeile hätten, würde sie wie
hello
verwandelt aussehenbyelo
.Ausgabe - Jede Zeile wird neu geschrieben, ohne dass ein alter Text angezeigt wird:
Nächste Zeile (komplett in derselben Zeile neu geschrieben):
quelle