печать динамически строки в одну строку в Python

Я пытаюсь напечатать строки в одну строку.

Я нашел решения, но они не работают с окнами правильно.

У меня есть текстовый файл с именами, и я хочу напечатать их так

name=john затем смени Джона на следующее имя и сохраниname=Я создал этот код, но неправильно работал с окнами:

op = open('names.txt','r')
print 'name=',
for i in op.readlines():
    print '\r'+i.strip('\n')

Спасибо за ваше время

 senderle16 июн. 2012 г., 16:26
Просто чтобы уточнить, вы хотитеoverwrite часть линии, это правильно?

Ответы на вопрос(2)

Решение Вопроса

import sys
import time

sys.stdout.write('name=')
last_lenght = 0
with open('names.txt') as names:
    for name in names:
        sys.stdout.write('\b' * last_lenght)    # go back
        sys.stdout.write(' ' * last_lenght)     # clear last name
        sys.stdout.write('\b' * last_lenght)    # reposition
        sys.stdout.write(name.strip())
        sys.stdout.flush()
        last_lenght = len(name.strip())
        time.sleep(0.5)

\r в этом случае работать не будет, потому что это возвращает вас к началу строки, поэтому вам придется перепечатать всю строку. Кроме того, в некоторых системах (включая Windows, я думаю) Pythonprint оператор (функция в 3+) интерпретирует\r как новая строка. Я верю этому кодуshould быть независимым от системы.

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
 16 июн. 2012 г., 17:07
@EngHamoud, посмотрите мое последнее изменение, так как я считаю, что это самое чистое решение.
 16 июн. 2012 г., 16:48
@EngHamoud, см. Мое редактирование. Новый код должен работать правильно. Может быть лучший способ сделать это, но это работает по крайней мере!
 Hamoudaq16 июн. 2012 г., 16:34
сэр, ваш код не работает с окнами, проблема в том, что вы печатаете длинное имя, напримерnaaaaaaaaaaaaame тогда следующее имя будетjohn выход будет какjohnaaaaaaaaaame Я попробовал ваши решения, прежде чем опубликовать эту проблему, и не работал с Windows.
 16 июн. 2012 г., 16:37
Ах! Конечно --\r обычно используется для печати строк одинаковой длины. Это не будет работать на любой системе для ваших целей! Я обновлю.
 Hamoudaq16 июн. 2012 г., 16:52
да, это работает, спасибо, очень много, но на самом деле это немного kludge, спасибо, в любом случае, я постараюсь найти более подходящий способ

Ваш ответ на вопрос