Как мне записать вывод в том же месте на консоли?

Я новичок в 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 есть много способов форматирования строки и даже встроенный форматированный строковый тип.

Как отформатировать строку

  1. в format()функция. (несколько примеров )
  2. Форматированные строковые литералы или f-строки с общим именем .
  3. форматирование с использованием% (подробнее об этом )

Примеры

      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="")
Другие вопросы по тегам