2014-04-17 3 views
0

Есть что-то, чего я не получаю, когда пишу sys.stdout в Python.Что я хочу написать некоторые строки в stdout, не предваряя материал, который уже был написан до этого.Очистка старых данных из sys.stdout в Python

Так как это сделать:

while True: 

    sys.stdout.write("k") 
    sys.stdout.flush() 

sys.stdout.write("d") 

После некоторых данных «К» было написано в стандартный вывод в цикле мне нужно написать некоторые новые данные впоследствии, что «d» для примера. Я получаю: «k d» на выходе. «K» из записи цикла все еще находится в режиме stdout.

То, что я хочу получить, это просто «d».

Почему? Как я могу удалить stdout, прежде чем записывать в него новые данные?

Btw, используя print(), вместо этого накапливает старые данные в конечный результат.

Использование Python 2.7 на Linux

+0

Я не уверен, что понял вопрос. Что именно вы подразумеваете под «очисткой» stdout? Что должно произойти с материалом, уже написанным на консоль? – NPE

+0

См. Мое обновление.Я просто хочу увидеть в терминале последнюю написанную строку –

+1

Ну, конечно, 'k' печатается. Вы напечатали его, а затем поверх этого вы сбросили «stdout», чтобы заставить его печатать сразу! Если вы не хотите, чтобы что-то печаталось, не печатайте ... это? – kindall

ответ

2

терминалы не работают таким образом. flush просто сбрасывает буфер (т. Е. Символы, которые еще не были напечатаны на экране), он не очищает экран.

Если вы хотите удалить один символ, вам нужно напечатать буквенный символ управления забоем, а затем напечатать что-нибудь над предыдущим выводом (как пробел):

sys.stdout.write("\b ") 

Однако. Ваш вопрос об этом противоречит глубокому непониманию того, как работают терминалы. Подумайте об этом как текстовом процессоре - на экране есть текст и курсор (который невидим). Вам нужно указать курсору, что делать, чтобы манипулировать текстом на экране. Поскольку курсор всегда находится в режиме перезаписи, трюк, который часто бывает полезно, чтобы вернуться к началу строки:

sys.stdout.write("\r") 

и перезаписывать данные на этой строке. Обратите внимание, что если ваши новые данные имеют меньшую длину, чем предыдущие данные, это оставит некоторые данные на экране.

Есть и другие трюки, которые вы можете использовать, если ни один из них не соответствует вашему счету, например, вывод terminal control sequences в стандартный вывод.

(также, если у вас нет особой необходимости использования sys.stdout, просто используйте print.)

+0

Хорошо! sys, stdout.write («\ r») помогли, поскольку мой последний отпечаток длиннее. Спасибо. –

0

Я должен напечатать «к», но на одну строку перед «г» .Я хочу напечатать «D» в совершенно новой линии.

Просто написать строку между двумя:

sys.stdout.write("\n") 

Или просто использовать print, который добавляет неявный символ новой строки в конце:

print "k" 
print "d" 
+0

Если вы используете печать «d», она добавляет «k» к началу. Просто проверите это. Также, если вы используете sys.stdout.write («\ n»), это пространство по-прежнему добавляет «k» из предыдущей печати, поэтому что я получаю «k» на новой строке (после того, как был напечатан исходный «K»), а затем «d» –

Смежные вопросы