Я хотел бы создать несколько операторов, которые выдают стандартный вывод, не видя перевода строк между операторами.
В частности, предположим, у меня есть:
for item inrange(1,100): print item
Результатом является:
1 2 3 4 . . .
Как сделать так, чтобы это выглядело следующим образом:
12345 ...
Еще лучше, можно ли напечатать единственное число поверх последнего числа, чтобы на экране одновременно отображалось только одно число?
Переведено автоматически
Ответ 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 inrange(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 inrange(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 inrange(to): print("{0}{1:{2}}".format(delete, i, digits), end="") sys.stdout.flush()
Ответ 4
Как и в других примерах, я использую аналогичный подход, но вместо того, чтобы тратить время на вычисление последней выходной длины и т. Д,
Я просто использую экранирование кода ANSI, чтобы вернуться к началу строки, а затем очистить всю эту строку перед печатью вывода моего текущего состояния.
import sys
classPrinter(): """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