Как записать вывод в одно и то же место консоли?
-
21-08-2019 - |
Вопрос
Я новичок в Python и пишу несколько скриптов для автоматизации загрузки файлов с FTP-серверов и т. д.Я хочу показать ход загрузки, но хочу, чтобы он оставался в том же положении, например:
выход:
Загрузка файла FooFile.txt [47%]
Я пытаюсь избежать чего-то вроде этого:
Downloading File FooFile.txt [47%]
Downloading File FooFile.txt [48%]
Downloading File FooFile.txt [49%]
Как мне это сделать?
Дублировать: Как я могу печатать поверх текущей строки в приложении командной строки?
Решение
Вы также можете использовать возврат каретки:
sys.stdout.write("Download progress: %d%% \r" % (progress) )
sys.stdout.flush()
Другие советы
Используйте библиотеку обработки терминала, например модуль проклятий:
Модуль Curses предоставляет интерфейс к библиотеке Curses, которая является стандартом де-факто для расширенной портативной обработки терминалов.
Питон 2
Мне нравится следующее:
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Демо:
import time
for i in range(100):
time.sleep(0.1)
print 'Downloading File FooFile.txt [%d%%]\r'%i,
Питон 3
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Демо:
import time
for i in range(100):
time.sleep(0.1)
print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Распечатать символ возврата \b
несколько раз, а затем замените старый номер новым.
#kinda like the one above but better :P
from __future__ import print_function
from time import sleep
for i in range(101):
str1="Downloading File FooFile.txt [{}%]".format(i)
back="\b"*len(str1)
print(str1, end="")
sleep(0.1)
print(back, end="")
Для Python 3xx:
import time
for i in range(10):
time.sleep(0.2)
print ("\r Loading... {}".format(i)+str(i), end="")
Опрятное решение, которое работало для меня:
from __future__ import print_function
import sys
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r')
sys.stdout.flush()
print("")
А sys.stdout.flush
важно, иначе это станет очень неуклюжим и print("")
выход из цикла также важен.
ОБНОВЛЯТЬ:Как упоминалось в комментариях, print
также есть flush
аргумент.Таким образом, следующее также будет работать:
from __future__ import print_function
for i in range(10**6):
perc = float(i) / 10**6 * 100
print(">>> Download is {}% complete ".format(perc), end='\r', flush=True)
print("")
x="A Sting {}"
for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")
for j in range(0,len(y)):
print("\b",end="")