Удалить и заменить отпечатанные элементы

Мне было интересно, можно ли удалить элементы, которые вы напечатали на Python, - не из графического интерфейса Python, а из командной строки. например

a = 0  
for x in range (0,3):  
    a = a + 1  
    b = ("Loading" + "." * a)
print (a)

так что он печатает

>>>Loading   
>>>Loading. 
>>>Loading.. 
>>>Loading...

Но моя проблема в том, что я хочу, чтобы все это было в одной строке, и для этого оно удаляет себя, когда появляется что-то еще. Поэтому вместо печати "Loading", "Loading.", "Loading... я хочу, чтобы он напечатал "Loading.", затем он удаляет то, что находится в строке, и заменяет его на "Loading..", а затем удаляет "Loading.." и заменяет его (в той же строке) на "Loading...". Это сложно описать.

p.s Я пробовал использовать символ Backspace, но похоже, что он не работает ("\b")

Спасибо


person Alex    schedule 13.03.2011    source источник
comment
Какой здесь смысл переменной a? Вы можете просто использовать x в качестве переменной, и она будет делать то же самое!   -  person John Howard    schedule 13.03.2011
comment
Два вопроса: 1. Разве print() команда не должна отступать на уровень внутренней части цикла for? В настоящее время ваш код не выводит какой-то прогресс, а только конечное состояние. 2. Разве это не должно быть print (b)? В настоящее время печатаются только целые числа, а не "Loading", как указано в вопросе.   -  person Qaswed    schedule 19.08.2019


Ответы (3)


Просто используйте CR, чтобы перейти к началу строки.

import time
for x in range (0,5):  
    b = "Loading" + "." * x
    print (b, end="\r")
    time.sleep(1)
person Keith    schedule 13.03.2011
comment
Он работает в базовом терминале Windows 7. В python 2.7 я просто использую print "whatever to be removed\r", Спасибо! - person PhilMacKay; 31.10.2016
comment
Есть идеи для терминала (IDLE)? - person Black Thunder; 29.07.2017
comment
sys.stdout.write("\033[K"), чтобы очистить предыдущий отпечаток - person ; 09.03.2018
comment
@ h0ussni Я не знаю колдовства, но оно отлично работает - person Dustin Michels; 15.03.2019
comment
sys.stdout.write('\033[2K\033[1G') стереть и перейти к началу строки - person sound wave; 20.06.2019
comment
Боковое примечание: чтобы сделать эту работу в jupyter (в python3), используйте: print("\r", b, end="") - person proximitytopie; 30.03.2020
comment
Чтобы очистить все или n ранее напечатанных строк и переместить курсор обратно в начало, не сбрасывая каждый раз весь вывод консоли (os.system('cls' if os.name=='nt' else 'clear') совместимость с ОС), используйте cursor_up = '\x1b[1A';erase_line = '\x1b[2K';print("hi\nyou\nthere\nletstry!");print((cursor_up + erase_line)*4 +cursor_up);print("hi\nyou\nthere\nletstry!") - person do-me; 16.01.2021
comment
Вместо "." * x попробуйте "." * (x % 3 + 1), чтобы избежать таких вещей, как Loading...... - person a2br; 19.02.2021
comment
в VS Code и Notebooks (ipynb) используйте их вместе: print("\r" , end="") print("delta = ", delta, end="") - person Khalil Al-rahman Yossefi; 25.06.2021

Один из способов - использовать escape-последовательности ANSI:

import sys
import time
for i in range(10):
    print("Loading" + "." * i)
    sys.stdout.write("\033[F") # Cursor up one line
    time.sleep(1)

Также иногда полезно (например, если вы печатаете что-то короче, чем раньше):

sys.stdout.write("\033[K") # Clear to the end of line
person Sven Marnach    schedule 13.03.2011
comment
Не работает в ноутбуках на Python :( - person markroxor; 12.05.2018
comment
Обязательно ли использовать sys.stdout.write ()? Вы можете просто напечатать (\ 033 [K, end = '')? - person Trevor; 12.07.2018
comment
@Trevor Этот ответ был написан для работы как в Python 2, так и в 3. Я знаю, что вопрос помечен как python-3.x, но в 2011 году почти никто не использовал Python 3, поэтому я написал ответ, который работает в обеих версиях. Если вы используете Python 3, вы можете использовать print(..., end=""), если хотите. - person Sven Marnach; 12.07.2018
comment
Можете ли вы теоретически сделать sys.stdout.write("\033[F" * 2), если хотите переместить курсор на 2 строки вверх? - person madladzen; 23.07.2020
comment
@madladzen Это должно сработать. Последовательность ANSI также поддерживает параметр, поэтому вы также можете использовать sys.stdout.write("\033[2F"). - person Sven Marnach; 23.07.2020

import sys
import time

a = 0  
for x in range (0,3):  
    a = a + 1  
    b = ("Loading" + "." * a)
    # \r prints a carriage return first, so `b` is printed on top of the previous line.
    sys.stdout.write('\r'+b)
    time.sleep(0.5)
print (a)

Обратите внимание, что вам, возможно, придется запустить sys.stdout.flush() сразу после sys.stdout.write('\r'+b), в зависимости от того, с какой консоли вы выполняете печать, чтобы результаты были напечатаны по запросу без какой-либо буферизации.

person unutbu    schedule 13.03.2011
comment
Это работает без постоянного дрожания в консоли pycharm. Печать с end = много мерцает в консоли pycharm - person SATYAJEET RANJAN; 13.04.2020