367 Stimmen

Dynamischer Druck in einer Zeile

Ich möchte mehrere Anweisungen erstellen, die eine Standardausgabe erzeugen, ohne dass zwischen den Anweisungen Zeilenumbrüche auftreten.

Konkret: Nehmen wir an, ich habe:

for item in range(1,100):
    print item

Das Ergebnis ist:

1
2
3
4
.
.
.

Wie kann dies stattdessen aussehen?

1 2 3 4 5 ...

Noch besser: Ist es möglich, die einzelne Nummer zu drucken über die letzte Zahl, so dass immer nur eine Zahl auf dem Bildschirm zu sehen ist?

15voto

Brooks Punkte 2092

Ändern

print item

zu

print "\033[K", item, "\r",
sys.stdout.flush()
  • " \033 [K" löscht bis zum Ende der Zeile
  • ザ \r , kehrt zum Anfang der Zeile zurück
  • Die Flush-Anweisung sorgt dafür, dass die Daten sofort angezeigt werden, so dass Sie eine Echtzeitausgabe erhalten.

15voto

Hugh Perkins Punkte 7016

So viele komplizierte Antworten. Wenn Sie Python 3 haben, setzen Sie einfach \r am Anfang des Ausdrucks, und fügen Sie end='', flush=True dazu:

import time

for i in range(10):
    print(f'\r{i} foo bar', end='', flush=True)
    time.sleep(0.5)

Damit wird geschrieben 0 foo bar dann 1 foo bar usw., an Ort und Stelle.

5voto

copeland3300 Punkte 561

Eine andere Antwort, die ich unter 2.7 verwende, bei der ich einfach jedes Mal, wenn eine Schleife läuft, ein "." ausdrucke (um dem Benutzer anzuzeigen, dass die Dinge noch laufen), ist diese:

print "\b.",

Es druckt die "."-Zeichen ohne Leerzeichen zwischen den einzelnen Zeichen. Das sieht etwas besser aus und funktioniert recht gut. Die \b ist ein Backspace-Zeichen für diejenigen, die sich wundern.

4voto

xortion Punkte 59

Ich denke, eine einfache Verbindung sollte funktionieren:

nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)

3voto

cji Punkte 6426

"Übrigens...... Wie kann man es jedes Mal aktualisieren, damit es an einer Stelle gedruckt wird, indem man einfach die Nummer ändert."

Das ist ein wirklich heikles Thema. Was zack (Ausgabe von Konsolensteuercodes) ist eine Möglichkeit, dies zu erreichen.

Sie können (n)curses verwenden, aber das funktioniert hauptsächlich auf *nixes.

Unter Windows (und hier kommt der interessante Teil), der selten erwähnt wird (ich kann nicht verstehen, warum), können Sie Python-Bindungen an WinAPI verwenden ( http://sourceforge.net/projects/pywin32/ auch mit ActivePython standardmäßig) - es ist nicht so schwer und funktioniert gut. Hier ist ein kleines Beispiel:

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    output_handle.WriteConsoleOutputCharacter( i, pos )
    time.sleep( 1 )

Oder, wenn Sie Folgendes verwenden möchten print (Anweisung oder Funktion, kein Unterschied):

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    print i
    output_handle.SetConsoleCursorPosition( pos )
    time.sleep( 1 )

win32console Modul ermöglicht es Ihnen, viele weitere interessante Dinge mit der Windows-Konsole zu tun... Ich bin kein großer Fan von WinAPI, aber vor kurzem habe ich erkannt, dass mindestens die Hälfte meiner Abneigung dagegen durch das Schreiben von WinAPI-Code in C verursacht wurde - pythonische Bindungen sind viel einfacher zu verwenden.

Alle anderen Antworten sind natürlich toll und pythonisch, aber... Was wäre, wenn ich drucken wollte auf vorherige Linie? Oder einen mehrzeiligen Text schreiben, ihn dann löschen und dieselben Zeilen erneut schreiben? Meine Lösung macht das möglich.

CodeJaeger.com

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.

Powered by:

X