Ich möchte mehrere Anweisungen machen, die eine Standardausgabe liefern, ohne Zeilenumbrüche zwischen den Anweisungen zu sehen.
Angenommen, ich habe:
for item in range(1,100):
print item
Das Ergebnis ist:
1
2
3
4
.
.
.
Wie soll das stattdessen aussehen:
1 2 3 4 5 ...
Ist es noch besser, die einzelne Nummer über die letzte Nummer zu drucken , sodass immer nur eine Nummer auf dem Bildschirm angezeigt wird?
Antworten:
Wechseln
print item
zu:print item,
in Python 2.7print(item, end=" ")
in Python 3Wenn Sie die Daten dynamisch drucken möchten, verwenden Sie die folgende Syntax:
print(item, sep=' ', end='', flush=True)
in Python 3quelle
'\n'
Ende wird ein Zeichen geschrieben, es sei denn, dieprint
Anweisung endet mit einem Komma. Dies ist die einzige Aktion, wenn die Anweisung nur das Schlüsselwort enthältprint
.flush
nicht mitfrom __future__ import print_function
.print(item, end=", ")
, fügt dann auch,
zum letzten Element hinzu , wie zu verhindern ist, dass es,
zum letzten ElementIm Allgemeinen erfolgt dies mit Terminalsteuerungscodes . Dies ist ein besonders einfacher Fall, für den Sie nur ein Sonderzeichen benötigen: U + 000D CARRIAGE RETURN, das
'\r'
in Python (und vielen anderen Sprachen) geschrieben ist. Hier ist ein vollständiges Beispiel basierend auf Ihrem Code:Einige Dinge darüber, die überraschend sein können:
\r
am Anfang der Zeichenfolge, sodass der Cursor während der Ausführung des Programms immer hinter der Zahl steht. Dies ist nicht nur kosmetisch: Einige Terminalemulatoren sind sehr verwirrt, wenn Sie es umgekehrt machen.stdout.flush
ist auf einigen Systemen erforderlich, oder Sie erhalten keine Ausgabe. Andere Systeme benötigen es möglicherweise nicht, aber es schadet nicht.Wenn Sie feststellen, dass dies nicht funktioniert, sollten Sie zunächst vermuten, dass Ihr Terminalemulator fehlerhaft ist. Das vttest- Programm kann Ihnen beim Testen helfen.
Sie könnten das
stdout.write
durch eineprint
Anweisung ersetzen, aber ich bevorzuge es, nichtprint
mit der direkten Verwendung von Dateiobjekten zu mischen .quelle
flush()
zwingt eine Datei, alles, was sie gerade hat, an das Betriebssystem zu senden. Ich bin überrascht, dass es für Sie ohne das funktioniert - es hat für mich nicht funktioniert, bis ich es hinzugefügt habe.ncurses
, dies zu tun.sys.stdout.flush()
scheint auf meinemFreebsd
mit zu heilenPython 2.7
Verwenden Sie
print item,
diese Option, um die print-Anweisung den Zeilenumbruch wegzulassen.In Python 3 ist es
print(item, end=" ")
.Wenn Sie möchten, dass jede Nummer an derselben Stelle angezeigt wird, verwenden Sie beispielsweise (Python 2.7):
In Python 3 ist es etwas komplizierter. Hier müssen Sie spülen
sys.stdout
oder es wird nichts gedruckt, bis die Schleife beendet ist:quelle
Wie die anderen Beispiele verwende
ich einen ähnlichen Ansatz, aber anstatt Zeit damit zu verbringen, die letzte Ausgabelänge usw. zu berechnen.
Ich verwende einfach ANSI-Code-Escapezeichen, um zum Zeilenanfang zurückzukehren und dann die gesamte Zeile zu löschen, bevor ich meine aktuelle Statusausgabe drucke.
Zur Verwendung in Ihrer Iterationsschleife würden Sie einfach Folgendes aufrufen:
Sehen Sie hier mehr
quelle
Sie können Ihrer print-Anweisung ein nachfolgendes Komma hinzufügen, um in jeder Iteration ein Leerzeichen anstelle einer neuen Zeile zu drucken:
Wenn Sie Python 2.6 oder höher verwenden, können Sie alternativ die neue Druckfunktion verwenden, mit der Sie festlegen können, dass am Ende jedes zu druckenden Elements nicht einmal ein Leerzeichen stehen soll (oder ob Sie ein beliebiges Ende angeben möchten) wollen):
Schließlich können Sie direkt in die Standardausgabe schreiben, indem Sie sie aus dem sys-Modul importieren, das ein dateiähnliches Objekt zurückgibt:
quelle
Veränderung
zu
quelle
\033[K
Code erfahren haben ? Ich würde gerne mehr über sie erfahren.print
spült bereits intern. Keine Notwendigkeit, es anzurufen.print
ist anders als dort,sys.stdout.write()
wo Sie zum Bildschirm spülen müssenIch denke, ein einfacher Join sollte funktionieren:
quelle
print ' '.join(str(x) for x in range(1, 10))
.Eine andere Antwort, die ich in 2.7 verwende, wo ich nur ein "." Jedes Mal, wenn eine Schleife ausgeführt wird (um dem Benutzer anzuzeigen, dass die Dinge noch ausgeführt werden), gilt Folgendes:
Es druckt das "." Zeichen ohne Leerzeichen dazwischen. Es sieht ein bisschen besser aus und funktioniert ziemlich gut. Das \ b ist ein Rücktastezeichen für diejenigen, die sich fragen.
quelle
So viele komplizierte Antworten. Wenn Sie Python 3 haben, setzen Sie es einfach
\r
an den Anfang des Drucks und fügen Sieend='', flush=True
es hinzu:Dies wird
0 foo bar
dann1 foo bar
usw. an Ort und Stelle schreiben .quelle
print('\r' + filename + " ", end = '', flush=True)
Um die Zahlen gegenseitig zu überschreiben, können Sie Folgendes tun:
Das sollte funktionieren, solange die Nummer in der ersten Spalte gedruckt ist.
BEARBEITEN: Hier ist eine Version, die auch dann funktioniert, wenn sie nicht in der ersten Spalte gedruckt wird.
Ich sollte beachten, dass dieser Code getestet wurde und in Python 2.5 unter Windows in der Windows-Konsole einwandfrei funktioniert. Nach Ansicht einiger anderer kann eine Spülung von stdout erforderlich sein, um die Ergebnisse zu sehen. YMMV.
quelle
"Übrigens ...... Wie man es jedes Mal aktualisiert, damit es mi an einer Stelle druckt, ändere einfach die Nummer."
Es ist wirklich ein heikles Thema. Was zack vorgeschlagen hat (Ausgabe von Konsolensteuercodes), ist eine Möglichkeit, dies zu erreichen.
Sie können (n) Flüche verwenden, aber das funktioniert hauptsächlich mit * nixen.
Unter Windows (und hier geht ein interessanter Teil), der selten erwähnt wird (ich kann nicht verstehen, warum), können Sie Python-Bindungen an WinAPI verwenden ( http://sourceforge.net/projects/pywin32/ standardmäßig auch mit ActivePython) - dies ist nicht der Fall das ist hart und funktioniert gut. Hier ist ein kleines Beispiel:
Oder wenn Sie verwenden möchten
print
(Anweisung oder Funktion, kein Unterschied):win32console
Modul ermöglicht es Ihnen, viele weitere interessante Dinge mit Windows-Konsole zu tun ... Ich bin kein großer Fan von WinAPI, aber kürzlich wurde mir klar, dass mindestens die Hälfte meiner Abneigung dagegen durch das Schreiben von WinAPI-Code in C-Python-Bindungen verursacht wurde viel einfacher zu bedienen.Alle anderen Antworten sind natürlich großartig und pythonisch, aber ... Was wäre, wenn ich in der vorherigen Zeile drucken wollte ? Oder mehrzeiligen Text schreiben, dann löschen und die gleichen Zeilen erneut schreiben? Meine Lösung macht das möglich.
quelle
für Python 2.7
für Python 3
quelle
quelle
Wenn Sie nur die Zahlen drucken möchten, können Sie die Schleife vermeiden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 dauerte 21.1986929975ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 dauerte 491.466823551ms
quelle
map
.Der beste Weg, dies zu erreichen, ist die Verwendung des
\r
CharaktersVersuchen Sie einfach den folgenden Code:
quelle
In Python 3 können Sie dies folgendermaßen tun:
Ausgänge:
Tuple: Sie können mit einem Tupel das gleiche tun:
Ausgänge:
Ein anderes Beispiel:
Ausgänge:
Sie können Ihr Tupel sogar so auspacken:
Ausgänge:
eine andere Variante:
Ausgänge:
quelle
Ein Komma am Ende der print-Anweisung lässt die neue Zeile weg.
dies überschreibt aber nicht.
quelle
Für diejenigen, die wie ich Probleme hatten, habe ich Folgendes entwickelt, das sowohl in Python 3.7.4 als auch in 3.5.2 zu funktionieren scheint.
Ich habe den Bereich von 100 auf 1.000.000 erweitert, da er sehr schnell läuft und die Ausgabe möglicherweise nicht angezeigt wird. Dies liegt daran, dass ein Nebeneffekt der Einstellung darin
end='\r'
besteht, dass die letzte Schleifeniteration die gesamte Ausgabe löscht. Eine längere Anzahl wurde benötigt, um zu demonstrieren, dass es funktioniert. Dieses Ergebnis ist möglicherweise nicht in allen Fällen wünschenswert, war aber in meinem Fall in Ordnung, und OP hat die eine oder andere Art nicht angegeben. Sie könnten dies möglicherweise mit einer if-Anweisung umgehen, die die Länge des Arrays bewertet, über das iteriert wird usw. Der Schlüssel, um es in meinem Fall zum Laufen zu bringen, bestand darin, die Klammern"{}"
mit zu koppeln.format()
. Ansonsten hat es nicht funktioniert.Unten sollte funktionieren wie es ist:
quelle
Ausgabe: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
quelle
Oder noch einfacher:
end="\r"
wird vom Anfang [0:] des ersten Drucks überschrieben.quelle