Dynamisch in einer Zeile drucken

Lesezeit: 7 Minuten

Benutzer-Avatar
Pol

Ich möchte mehrere Anweisungen machen, die eine Standardausgabe liefern, ohne Zeilenumbrüche zwischen den Anweisungen zu sehen.

Angenommen, ich habe Folgendes:

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

Das Ergebnis ist:

1
2
3
4
.
.
.

Wie sieht das stattdessen so aus:

1 2 3 4 5 ...

Noch besser ist es möglich, die einzelne Nummer zu drucken Über die letzte Nummer, also ist immer nur eine Nummer auf dem Bildschirm?

  • Verwandter Beitrag – Wie drucke ich ohne Zeilenumbruch oder Leerzeichen?

    – RBT

    23. Juli 2018 um 10:07 Uhr

Benutzer-Avatar
E-Wand

Veränderung print item zu:

  • print item, in Python 2.7
  • print(item, end=" ") in Python3

Wenn Sie die Daten dynamisch drucken möchten, verwenden Sie die folgende Syntax:

  • print(item, sep=' ', end='', flush=True) in Python3

  • Aus http://docs.python.org/reference/simple_stmts.html#print: >A '\n' Zeichen wird am Ende geschrieben, es sei denn, die print Anweisung endet mit einem Komma. Dies ist die einzige Aktion, wenn die Anweisung nur das Schlüsselwort enthält print.

    – ewall

    28. Oktober 2013 um 19:34 Uhr

  • FYI: print(item, end=” “) kann in Python2.7 verwendet werden, indem ‘from Zukunft import print_function’ am Anfang der Datei.

    – Hek

    24. August 2016 um 21:29 Uhr


  • Aber flush funktioniert nicht mit from __future__ import print_function Unglücklicherweise.

    – Timmm

    27. April 2018 um 14:19 Uhr

  • @ewall, wenn ich tun sollte print(item, end=", ") es fügt dann auch hinzu , zum letzten Punkt, wie man verhindert, dass es hinzugefügt wird , zum letzten Artikel

    – Samir Tendulkar

    7. September 2018 um 20:43 Uhr

  • Dies funktionierte erst, nachdem ich hinzugefügt hatte '\r' zum Anfang meiner Drucksache

    – Nathan Tew

    6. Januar 2020 um 9:57 Uhr

Benutzer-Avatar
zwöl

Übrigens …… Wie man es jedes Mal aktualisiert, damit es mi an einer Stelle druckt, ändern Sie einfach die Nummer.

Im Allgemeinen geht das mit Terminal-Steuercodes. Dies ist ein besonders einfacher Fall, für den Sie nur ein Sonderzeichen benötigen: U+000D CARRIAGE RETURN, das geschrieben wird '\r' in Python (und vielen anderen Sprachen). Hier ist ein vollständiges Beispiel basierend auf Ihrem Code:

from sys import stdout
from time import sleep
for i in range(1,20):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(1)
stdout.write("\n") # move the cursor to the next line

Einige Dinge dazu, die vielleicht überraschen:

  • Das \r steht am Anfang der Zeichenfolge, so dass der Cursor während des Programmablaufs immer hinter der Zahl steht. Dies ist nicht nur kosmetisch: Einige Terminal-Emulatoren werden sehr verwirrt, wenn Sie es umgekehrt machen.
  • Wenn Sie die letzte Zeile nicht angeben, gibt Ihre Shell nach Beendigung des Programms ihre Eingabeaufforderung über der Zahl aus.
  • Das 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 Terminal-Emulator fehlerhaft ist. Das vttest Programm kann Ihnen helfen, es zu testen.

Die könntest du ersetzen stdout.write mit einer print Aussage, aber ich ziehe es vor, nicht zu mischen print mit direkter Verwendung von Dateiobjekten.

  • Was bedeutet die Funktion flush()? Weil es für mich ohne diese Funktion funktioniert!

    – Pol

    15. Juli 2010 um 2:53 Uhr

  • Normalerweise sammeln die Dateiobjekte von Python Daten, damit sie sie in großen Blöcken an das Betriebssystem senden können. Dies ist normalerweise das, was Sie für den Zugriff auf Dateien auf der Festplatte wünschen, aber es stört diese Art von Aufgabe. flush() zwingt eine Datei, alles, was sie hat, sofort an das Betriebssystem zu senden. Ich bin überrascht, dass es ohne das bei Ihnen funktioniert – bei mir hat es nicht funktioniert, bis ich es hinzugefügt habe.

    – zol

    15. Juli 2010 um 18:38 Uhr

  • @ user1995839 Es gibt Steuercodes zum Ausblenden des Cursors, aber wenn Sie dies tun möchten, empfehle ich Ihnen dringend, ihn zu verwenden ncurses es zu tun.

    – zol

    19. August 2014 um 15:02 Uhr

  • sys.stdout.flush() scheint bei mir obligatorisch zu sein Freebsd mit Python 2.7

    – Hakim

    26. März 2015 um 15:18 Uhr

  • Beachten Sie, dass der Wagenrücklauf in Python REPL nicht richtig funktioniert (zumindest für mich unter Ubuntu); Sie müssen a ausführen Skriptnicht nur einen REPL-Befehl ausführen, damit irgendetwas davon funktioniert.

    – Mark Amery

    22. Oktober 2017 um 13:58 Uhr

Benutzer-Avatar
Tim Pietzcker

Verwenden print item, um die Druckanweisung dazu zu bringen, den Zeilenumbruch wegzulassen.

In Python 3 ist es print(item, end=" ").

Wenn Sie möchten, dass jede Zahl an derselben Stelle angezeigt wird, verwenden Sie zum Beispiel (Python 2.7):

to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
    print "{0}{1:{2}}".format(delete, i, digits),

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:

import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
   print("{0}{1:{2}}".format(delete, i, digits), end="")
   sys.stdout.flush()

  • Tatsächlich sieht es für mich so aus, als würde Ihre Lösung jedes Mal die gleiche Anzahl von Rückschritten drucken. Wenn also to 20 ist, wird eine zusätzliche Rücktaste gedruckt, während die Ziffern 1..9 gedruckt werden. Sollten Sie nicht Ziffern innerhalb der Schleife berechnen und sie auf den Wert von i stützen?

    – Adam Crossland

    14. Juli 2010 um 20:01 Uhr

  • Es richtet die Nummer rechtsbündig aus und löscht immer alles. Ich habe nicht getestet, ob es schneller ist, dies zu tun oder in jeder Iteration zu berechnen, wie viele Ziffern gerade gelöscht werden müssen.

    – Tim Pietzcker

    14. Juli 2010 um 20:15 Uhr

  • Oder basieren Sie es auf dem vorherigen Wert von i, um zu berücksichtigen, wenn sich die Anzahl der Ziffern ändert.

    – Adam Crossland

    14. Juli 2010 um 20:16 Uhr

  • Ah, ja, die Rechtsbegründung hatte ich übersehen. Gute Lösung.

    – Adam Crossland

    14. Juli 2010 um 20:17 Uhr

  • Klingt ziemlich kompliziert. Ich würde wahrscheinlich nicht verstehen, was ich dort getan habe, wenn ich mir in einem Jahr meinen Code ansehen müsste. (Ich musste nur ein Programm lesen, das ich 2007 geschrieben habe – ich bin Also Ich bin froh, dass ich es in Python geschrieben habe.)

    – Tim Pietzcker

    14. Juli 2010 um 20:19 Uhr

Benutzer-Avatar
Matthew

Wie die anderen Beispiele
Ich verwende einen ähnlichen Ansatz, aber anstatt Zeit damit zu verbringen, die letzte Ausgabelänge usw. zu berechnen,

Ich verwende einfach ANSI-Code-Escapes, um zum Anfang der Zeile zurückzukehren, und lösche dann die gesamte Zeile, bevor ich meine aktuelle Statusausgabe drucke.

import sys class Printer(): """Dinge dynamisch in einer Zeile auf stdout drucken""" def __init__(self,data): sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()

To use in your iteration loop you would just call something like:

x = 1
for f in fileList:
    ProcessFile(f)
    output = "File number %d completed." % x
    Printer(output)
    x += 1   

See more here

change

print item

to

print "\033[K", item, "\r",
sys.stdout.flush()
  • “\033[K” clears to the end of the line
  • the \r, returns to the beginning of the line
  • the flush statement makes sure it shows up immediately so you get real-time output.

  • This is great for Python 2.7. Can you provide a reference to where you learned about the \033[K code? I’d like to learn more about them.

    – Klik

    Oct 16, 2017 at 20:50

  • print already flushes internally. No need to call it. print is different from sys.stdout.write() where you do have to flush to screen

    – Gabriel Fair

    Jun 3, 2018 at 22:34

user avatar
Eli Courtwright

You can add a trailing comma to your print statement to print a space instead of a newline in each iteration:

print item,

Alternatively, if you’re using Python 2.6 or later, you can use the new print function, which would allow you to specify that not even a space should come at the end of each item being printed (or allow you to specify whatever end you want):

from __future__ import print_function
...
print(item, end="")

Finally, you can write directly to standard output by importing it from the sys module, which returns a file-like object:

from sys import stdout
...
stdout.write( str(item) )

  • This is great for Python 2.7. Can you provide a reference to where you learned about the \033[K code? I’d like to learn more about them.

    – Klik

    Oct 16, 2017 at 20:50

  • print already flushes internally. No need to call it. print is different from sys.stdout.write() where you do have to flush to screen

    – Gabriel Fair

    Jun 3, 2018 at 22:34

user avatar
Hugh Perkins

So many complicated answers. If you have python 3, simply put \r at the start of the print, and add end='', flush=True to it:

import time

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

This will write 0 foo bar, then 1 foo bar etc, in-place.

  • Thank you, that was just what I needed print('\r' + filename + " ", end = '', flush=True)

    – McPeppr

    Nov 25, 2019 at 11:13


  • How to do this with a multiline print?

    – RnRoger

    Nov 29, 2020 at 0:18

1092910cookie-checkDynamisch in einer Zeile drucken

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy