Как мне записать вывод в том же месте на консоли?
Я новичок в python и пишу некоторые скрипты для автоматизации загрузки файлов с FTP-серверов и т. Д. Я хочу показать ход загрузки, но я хочу, чтобы он оставался в том же положении, например:
выход:
Загрузка файла FooFile.txt [47%]
Я пытаюсь избежать чего-то вроде этого:
Downloading File FooFile.txt [47%]
Downloading File FooFile.txt [48%]
Downloading File FooFile.txt [49%]
Как мне это сделать?
Дубликат: Как я могу печатать поверх текущей строки в приложении командной строки?
9 ответов
Вы также можете использовать возврат каретки:
sys.stdout.write("Download progress: %d%% \r" % (progress) )
sys.stdout.flush()
Python 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,
Python 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="")
Используйте библиотеку обработки терминалов, такую как модуль curses:
Модуль curses предоставляет интерфейс для библиотеки curses, де-факто стандарта для портативной расширенной обработки терминала.
Распечатать символ возврата \b
несколько раз, а затем перезаписать старый номер новым номером.
Для Python 3xx:
import time
for i in range(10):
time.sleep(0.2)
print ("\r Loading... ".format(i)+str(i), end="")
#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="")
Оптимальное решение, которое работает для меня:
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("")
В python 3 функция print может получать много аргументов. полная подпись функции print:
print(args*, sep=' ', end='\n', file=sys.stdout, flush=False)
когда
sep
является разделителем аргументов от
args*
,
end
как завершить напечатанную строку ('\ n \ означает новую строку) файл, где распечатать вывод (stdout- это консул), а flush - если очистить буфер.
Пример использования
import sys
a = 'A'
b = 0
c = [1, 2, 3]
print(a, b, c, 4, sep=' * ', end='\n' + ('-' * 21), file=sys.sdtout, flush=True)
Выход
A * 0 * [1, 2, 3] * 4
---------------------
В python есть много способов форматирования строки и даже встроенный форматированный строковый тип.
Как отформатировать строку
- в
format()
функция. (несколько примеров ) - Форматированные строковые литералы или f-строки с общим именем .
- форматирование с использованием% (подробнее об этом )
Примеры
name = 'my_name'
>>> print('my name is: {}'.format(name))
my name is: my_name
# or
>>> print('my name is: {user_name}'.format(user_name=name))
my name is: my_name
# or
>>> print('my name is: {0}'.format(name))
my name is: my_name
# or using f-strings
>>> print(f'my name is: {name}')
my name is: my_name
# or formatting with %
>>> print('my name is: %s' % name)
my name is: my_name
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="")