lenooh zufrieden meine Anfrage. Ich entdeckte diesen Artikel bei der Suche nach 'python suppress newline'. Ich verwende IDLE 3 auf Raspberry Pi zur Entwicklung von Python 3.2 für PuTTY .
Ich wollte einen Fortschrittsbalken in der PuTTY-Befehlszeile erstellen. Ich wollte nicht, dass die Seite wegscrollt. Ich wollte eine horizontale Linie, um den Benutzer vor dem Ausrasten zu bewahren, dass das Programm nicht zum Stillstand gekommen ist und auch nicht in einer fröhlichen Endlosschleife zum Mittagessen geschickt wurde - als Appell an die interaktive Nachricht "Lass mich in Ruhe, es geht mir gut, aber es kann einige Zeit dauern" - wie ein Fortschrittsbalken in Textform.
El print('Skimming for', search_string, '\b! .001', end='')
initialisiert die Nachricht, indem es den nächsten Schreibvorgang auf dem Bildschirm vorbereitet, bei dem drei Leerzeichen als Rubout und dann ein Punkt gedruckt werden, wodurch '001' gelöscht und die Zeile mit den Punkten verlängert wird.
Nach search_string
Benutzereingaben nachplappert, wird die \b!
stutzt das Ausrufezeichen meiner search_string
Text, um den Raum zu überdecken, der print()
sonst zwingt, die Interpunktion richtig zu setzen. Darauf folgen ein Leerzeichen und der erste "Punkt" des "Fortschrittsbalkens", den ich simuliere.
Unnötigerweise wird die Nachricht dann auch mit der Seitenzahl (formatiert auf eine Länge von drei mit führenden Nullen) versehen, um den Benutzer darauf aufmerksam zu machen, dass die Verarbeitung voranschreitet, und die auch die Anzahl der Perioden widerspiegelt, die wir später auf der rechten Seite aufbauen werden.
import sys
page=1
search_string=input('Search for?',)
print('Skimming for', search_string, '\b! .001', end='')
sys.stdout.flush() # the print function with an end='' won't print unless forced
while page:
# some stuff…
# search, scrub, and build bulk output list[], count items,
# set done flag True
page=page+1 #done flag set in 'some_stuff'
sys.stdout.write('\b\b\b.'+format(page, '03')) #<-- here's the progress bar meat
sys.stdout.flush()
if done: #( flag alternative to break, exit or quit)
print('\nSorting', item_count, 'items')
page=0 # exits the 'while page' loop
list.sort()
for item_count in range(0, items)
print(list[item_count])
#print footers here
if not (len(list)==items):
print('#error_handler')
Das Fleisch des Fortschrittsbalkens befindet sich in der sys.stdout.write('\b\b\b.'+format(page, '03'))
Linie. Um nach links zu löschen, wird zunächst der Cursor über den drei numerischen Zeichen mit dem Zeichen ' \b\b\b ' als Rubout und fügt einen neuen Punkt hinzu, um die Länge des Fortschrittsbalkens zu erhöhen. Dann werden drei Ziffern der Seite geschrieben, bis zu der der Balken fortgeschritten ist. Weil sys.stdout.write()
auf einen vollen Puffer oder das Schließen des Ausgabekanals wartet, wird die sys.stdout.flush()
erzwingt das sofortige Schreiben. sys.stdout.flush()
ist in das Ende von print()
die mit print(txt, end='' )
. Dann durchläuft der Code seine alltäglichen, zeitintensiven Operationen, während er nichts mehr ausgibt, bis er hierher zurückkehrt, um drei Ziffern zurückzuwischen, einen Punkt hinzuzufügen und wieder drei Ziffern zu schreiben, inkrementiert.
Die drei Ziffern, die ausgelöscht und neu geschrieben werden, sind keineswegs notwendig - es ist nur eine Verzierung, die verdeutlicht sys.stdout.write()
gegen print()
. Sie könnten genauso gut mit einem Punkt beginnen und die drei schicken Backslash-B-Backspaces vergessen (und natürlich auch keine formatierten Seitenzahlen schreiben), indem Sie einfach die Punktleiste jedes Mal um eins länger drucken - ohne Leerzeichen oder Zeilenumbrüche, indem Sie einfach die sys.stdout.write('.'); sys.stdout.flush()
Paar.
Bitte beachten Sie, dass die Raspberry Pi IDLE 3 Python-Shell die Rücktaste nicht als Rubout erkennt, sondern stattdessen ein Leerzeichen ausgibt, wodurch eine scheinbare Liste von Brüchen entsteht.
8 Stimmen
Für diejenigen, die die Dokumentation zur String-Formatierung von Python durchsuchen: docs.python.org/library/stdtypes.html#string-formatting
1 Stimmen
Es sieht so aus, als ob eine ähnliche Frage schon einmal gestellt worden wäre: https://stackoverflow.com/q/255147/9325817
1 Stimmen
Etwas spät zur Party, aber warum nicht
print("." * 10)
?0 Stimmen
Erläuterung zu wie zu verwenden
sep
yend
in python Druckanweisung