Ich schreibe einen FTP-Downloader. Ein Teil des Codes ist ungefähr so:
ftp.retrbinary("RETR " + file_name, process)
Ich rufe den Funktionsprozess auf, um den Rückruf zu behandeln:
def process(data):
print os.path.getsize(file_name)/1024, 'KB / ', size, 'KB downloaded!'
file.write(data)
und die Ausgabe ist ungefähr so:
1784 KB / KB 1829 downloaded!
1788 KB / KB 1829 downloaded!
etc...
Ich möchte jedoch, dass diese Zeile gedruckt und beim nächsten Mal erneut gedruckt / aktualisiert wird, sodass sie nur einmal angezeigt wird und der Fortschritt dieses Downloads angezeigt wird.
Wie geht das?
python
refresh
progress-bar
Kristian
quelle
quelle
Antworten:
Hier ist Code für Python 3.x:
Das
end=
Schlüsselwort ist das, was hier funktioniert - standardmäßigprint()
endet es mit einem newline (\n
) - Zeichen, das jedoch durch eine andere Zeichenfolge ersetzt werden kann. In diesem Fall setzt das Beenden der Zeile mit einem Wagenrücklauf stattdessen den Cursor an den Anfang der aktuellen Zeile. Daher ist es nicht erforderlich, dassys
Modul für diese einfache Verwendung zu importieren .print()
hat tatsächlich eine Reihe von Schlüsselwortargumenten, mit denen Code erheblich vereinfacht werden kann.Um denselben Code unter Python 2.6+ zu verwenden, setzen Sie die folgende Zeile oben in die Datei:
quelle
from __future__ import print_function
.print "foo",
Sie müssen jedoch danach noch spülen, um die Änderung zu sehen:sys.stdout.flush()
\r
am Anfang der Zeichenfolge einfügen undend=''
stattdessen festlegen musste , damit dies funktioniert. Ich glaube nicht, dass es meinem Terminal gefällt, wenn ich mit\r
flush=True
dieprint()
Funktion erweitern, um sicherzustellen, dass der Puffer\n
geleert wird (der Standardzeilenpuffer wird nur geleert, wenn eine neue Zeile geschrieben wird).\r
am Anfang und amend=''
besten und reibungslosesten funktioniert. Verwenden Sieflush=True
mit\r
am Ende, wenn die Zeichenfolge undend='\r'
auch funktioniert hat, aber nicht glatt war und die Linie und ihren Zeilenvorschub gelöscht hat.Wenn Sie nur eine einzelne Zeile ändern möchten, verwenden Sie
\r
.\r
bedeutet Wagenrücklauf. Der Effekt besteht ausschließlich darin, das Caret wieder an den Anfang der aktuellen Zeile zu setzen. Es löscht nichts. Ebenso\b
kann verwendet werden, um ein Zeichen rückwärts zu gehen. (Einige Terminals unterstützen möglicherweise nicht alle diese Funktionen.)quelle
\r
dies Wagenrücklauf bedeutet. Der Effekt besteht ausschließlich darin, das Caret wieder an den Anfang der aktuellen Zeile zu setzen. es löscht nichts. In ähnlicher Weise\b
kann ein Zeichen rückwärts gehen. (Einige Terminals unterstützen möglicherweise nicht alle diese Funktionen)sys.stdout.write('%s\r', size_str')
Ich denke dusys.stdout.write('%s\r' % size_str)
meintest , aber es funktioniert nicht.print
anstatt,sys.stdout.write
wenn Sie es vorziehen:print size_str + "\r",
funktioniert gut. Die,
Anweisung am Ende der print-Anweisung unterdrückt den Zeilenumbruch.sys.stdout.flush()
wird noch benötigtSchauen Sie sich die Dokumentation zum Curses-Modul und das HOWTO des Curses-Moduls an .
Wirklich einfaches Beispiel:
quelle
clrtoeol
für , wenn die zweite Linie kürzer ist als die erste.Hier ist meine kleine Klasse, die Textblöcke nachdrucken kann. Der vorherige Text wird ordnungsgemäß gelöscht, sodass Sie Ihren alten Text mit kürzerem neuen Text überschreiben können, ohne dass es zu Unordnung kommt.
quelle
Ich habe festgestellt, dass für eine einfache print-Anweisung in Python 2.7 einfach ein Komma am Ende nach Ihrem steht
'\r'
.Dies ist kürzer als bei anderen Nicht-Python-3-Lösungen, aber auch schwieriger zu warten.
quelle
Sie können einfach '\ r' am Ende der Zeichenfolge und ein Komma am Ende der Druckfunktion hinzufügen. Beispielsweise:
quelle
end
eingestellt,\n
dass Sie drucken(...)KB downloaded!\r\n
. Liege ich falsch?end = '\r'
stattdessen behebt das Problem in Python 3.Ich verwende Spyder 3.3.1 - Windows 7 - Python 3.6, obwohl möglicherweise kein Flush erforderlich ist. basierend auf diesem Beitrag - https://github.com/spyder-ide/spyder/issues/3437
quelle
Um die vorherige Zeile in Python zu überschreiben, müssen Sie lediglich end = '\ r' zur Druckfunktion hinzufügen. Testen Sie dieses Beispiel:
quelle