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

StackOverflow https://stackoverflow.com/questions/517127

  •  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="")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top