Вопрос-Ответ

Print in one line dynamically [duplicate]

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

Я хотел бы создать несколько операторов, которые выдают стандартный вывод, не видя перевода строк между операторами.

В частности, предположим, у меня есть:

for item in range(1,100):
print item

Результатом является:

1
2
3
4
.
.
.

Как сделать так, чтобы это выглядело следующим образом:

1 2 3 4 5 ...

Еще лучше, можно ли напечатать единственное число поверх последнего числа, чтобы на экране одновременно отображалось только одно число?

Переведено автоматически
Ответ 1

Изменить print item на:


  • print item, в Python 2.7

  • print(item, end=" ") в Python 3

Если вы хотите печатать данные динамически, используйте следующий синтаксис:


  • print(item, sep=' ', end='', flush=True) в Python 3

Ответ 2

Кстати...... Как обновлять его каждый раз, чтобы он печатал mi в одном месте, просто измените число.


В общем, это можно сделать с помощью управляющих кодов терминала. Это особенно простой случай, для которого вам нужен только один специальный символ: U+000D ВОЗВРАТ КАРЕТКИ, который написан '\r' на Python (и многих других языках). Вот полный пример, основанный на вашем коде:

from sys import stdout
from time import sleep
for i in range(1,20):
stdout.write("\r%d" % i)
stdout.flush()
sleep(1)
stdout.write("\n") # move the cursor to the next line

Некоторые вещи в этом процессе могут вызвать удивление:


  • \r идет в начале строки, так что во время работы программы курсор всегда будет находиться после числа. Это не просто косметический эффект: некоторые эмуляторы терминалов сильно запутываются, если вы делаете это наоборот.

  • Если вы не включите последнюю строку, то после завершения работы программы ваша оболочка напечатает свое приглашение поверх числа.

  • В некоторых системах stdout.flush необходимо, иначе вы не получите никаких выходных данных. В других системах это может и не потребоваться, но вреда от этого не будет.

Если вы обнаружите, что это не работает, первое, что вы должны заподозрить, это то, что в вашем эмуляторе терминала есть ошибки. Программа vttest может помочь вам протестировать это.

Вы могли бы заменить оператор stdout.write на print, но я предпочитаю не смешивать print с прямым использованием файловых объектов.

Ответ 3

Используйте print item,, чтобы заставить оператор print опустить новую строку.

В Python 3 это print(item, end=" ").

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

to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
print "{0}{1:{2}}".format(delete, i, digits),

В Python 3 это немного сложнее; здесь вам нужно выполнить сброс sys.stdout или он ничего не напечатает до завершения цикла:

import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
print("{0}{1:{2}}".format(delete, i, digits), end="")
sys.stdout.flush()
Ответ 4

Как и в других примерах,
я использую аналогичный подход, но вместо того, чтобы тратить время на вычисление последней выходной длины и т. Д,

Я просто использую экранирование кода ANSI, чтобы вернуться к началу строки, а затем очистить всю эту строку перед печатью вывода моего текущего состояния.

import sys

class Printer():
"""Print things to stdout on one line dynamically"""
def __init__(self,data):
sys.stdout.write("\r\x1b[K"+data.__str__())
sys.stdout.flush()

Для использования в вашем цикле итерации вам просто нужно вызвать что-то вроде:

x = 1
for f in fileList:
ProcessFile(f)
output = "File number %d completed." % x
Printer(output)
x += 1

Подробнее здесь

python