Просто использование \r
не будет работать в этом случае, потому что это возвращает вас к началу строки, поэтому вам придется перепечатать всю строку. Кроме того, в некоторых системах (включая Windows, я думаю) оператор Python print
(функция в 3+) интерпретирует \r
как новую строку. Я считаю, что этот код должен быть системно-независимым.
import sys, time
with open('names.txt', 'r') as names:
prev_len = 0
for name in names:
sys.stdout.write('\r' + ' ' * prev_len)
sys.stdout.flush()
output_string = '\rname={}'.format(name.strip())
prev_len = len(output_string)
sys.stdout.write(output_string)
sys.stdout.flush()
time.sleep(0.3)
print
Вы также можете использовать \b
, который обычно перемещает курсор на одно место.
Как вы указали, необходимо перезаписать ранее напечатанную строку пробелами , что означает, что необходимо запомнить длину предыдущей строки. Думаю, имеет смысл инкапсулировать это состояние в объект. Вот намного более чистое решение, чем выше, которое использует эту стратегию:
import sys, time
class LineUpdater(object):
def __init__(self, outfile=None):
self.prev_len = 0
self.outfile = sys.stdout if outfile is None else outfile
def write(self, line):
line = line.strip()
output = '\r{:<{width}}'.format(line, width=self.prev_len)
self.prev_len = len(line)
self.outfile.write(output)
self.outfile.flush()
with open('names.txt', 'r') as names:
out = LineUpdater()
for name in names:
out.write('name={}'.format(name))
time.sleep(0.3)
print