Непрерывная интеграция с использованием композитора

Просто использование \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
14
задан Daniel Daranas 27 August 2013 в 08:31
поделиться