Я хотел бы сделать несколько утверждений, которые дают стандартный вывод, не видя новых строк между утверждениями.
В частности, предположим, у меня есть:
for item in range(1,100):
print item
Результат:
1
2
3
4
.
.
.
Как заставить это выглядеть вместо этого:
1 2 3 4 5 ...
Более того, возможно ли напечатать одно число поверх последнего числа, чтобы на экране одновременно отображалось только одно число?
Ответы:
Изменить
print item
на:print item,
в Python 2.7print(item, end=" ")
в Python 3Если вы хотите распечатать данные динамически, используйте следующий синтаксис:
print(item, sep=' ', end='', flush=True)
в Python 3источник
'\n'
пишется в конце, если толькоprint
оператор не заканчивается запятой. Это единственное действие, если инструкция содержит только ключевое словоprint
.flush
не работает сfrom __future__ import print_function
к сожалению.print(item, end=", ")
то также добавил,
к последнему пункту, как это сделать, чтобы предотвратить добавление,
к последнему элементуВ общем, способ сделать это с помощью управляющих кодов терминала . Это особенно простой случай, для которого вам нужен только один специальный символ: U + 000D ВОЗВРАТ ЗАРЯДА, который написан
'\r'
на Python (и многих других языках). Вот полный пример, основанный на вашем коде:Некоторые вещи об этом, которые могут быть удивительными:
\r
идет в начале строки, поэтому во время работы программы курсор всегда будет после числа. Это не просто косметика: некоторые эмуляторы терминала очень запутываются, если вы делаете это наоборот.stdout.flush
необходимо в некоторых системах, иначе вы не получите никакого вывода. Другие системы могут не требовать этого, но это не приносит никакого вреда.Если вы обнаружите, что это не работает, первое, что вы должны подозревать, это то, что ваш эмулятор терминала глючит. Программа vttest может помочь вам проверить это.
Вы могли бы заменить
stdout.write
сprint
утверждением , но я предпочитаю не смешиватьprint
с прямым использованием файловых объектов.источник
flush()
заставляет файл отправлять все, что у него есть, в операционную систему прямо сейчас. Я удивлен, что это работает для вас без этого - это не работало для меня, пока я не добавил это.ncurses
это.sys.stdout.flush()
кажется, что mendatory на мойFreebsd
сPython 2.7
Используйте,
print item,
чтобы в операторе печати пропускалась новая строка.В Python 3 это так
print(item, end=" ")
.Если вы хотите, чтобы каждое число отображалось в одном и том же месте, используйте, например, (Python 2.7):
В Python 3 все немного сложнее; здесь вам нужно очистить,
sys.stdout
иначе он ничего не напечатает, пока цикл не закончится:источник
Как и в других примерах,
я использую аналогичный подход, но вместо того, чтобы тратить время на вычисление последней длины вывода и т. Д.,
Я просто использую экранирование кода ANSI, чтобы вернуться к началу строки, а затем очистить всю строку перед выводом моего текущего состояния.
Чтобы использовать в своем цикле итерации, вы бы просто вызвали что-то вроде:
Подробнее здесь
источник
Вы можете добавить запятую в свой оператор печати, чтобы печатать пробел вместо новой строки в каждой итерации:
В качестве альтернативы, если вы используете Python 2.6 или более позднюю версию, вы можете использовать новую функцию печати, которая позволит вам указать, что в конце каждого печатаемого элемента не должно быть пробела (или разрешить указывать конец хотеть):
Наконец, вы можете записать напрямую в стандартный вывод, импортировав его из модуля sys, который возвращает файл-подобный объект:
источник
изменение
в
источник
\033[K
коде? Я хотел бы узнать больше о них.print
уже сбрасывает внутренне. Не нужно называть это.print
отличается от того,sys.stdout.write()
где вы должны сбросить на экранЯ думаю, что простое соединение должно работать:
источник
print ' '.join(str(x) for x in range(1, 10))
.Другой ответ, который я использую на 2.7, где я просто распечатываю "." каждый раз, когда выполняется цикл (чтобы показать пользователю, что все еще работает) это:
Он печатает "." символы без пробелов между каждым. Это выглядит немного лучше и работает довольно хорошо. \ B является символом возврата для тех, кто интересуется.
источник
Так много сложных ответов. Если у вас есть Python 3, просто поместите
\r
в начале печати и добавьтеend='', flush=True
к нему:Это напишет
0 foo bar
, затем и1 foo bar
т. Д., На месте.источник
print('\r' + filename + " ", end = '', flush=True)
Чтобы числа перезаписывали друг друга, вы можете сделать что-то вроде этого:
Это должно работать, пока число напечатано в первом столбце.
РЕДАКТИРОВАТЬ: Вот версия, которая будет работать, даже если она не напечатана в первом столбце.
Я должен отметить, что этот код был протестирован и прекрасно работает в Python 2.5 для Windows, в консоли WIndows. Согласно некоторым другим, для просмотра результатов может потребоваться очистка stdout. YMMV.
источник
"Кстати ...... Как обновлять его каждый раз, чтобы он печатал ми в одном месте, просто измените номер".
Это действительно сложная тема. Какой Зак предложил (вывод управляющих кодов консоли), является одним из способов достижения этого.
Вы можете использовать (n) curses, но это работает в основном на * nixes.
В Windows (и здесь идет интересная часть), которая редко упоминается (я не могу понять почему), вы можете использовать привязки Python к WinAPI ( http://sourceforge.net/projects/pywin32/ также с ActivePython по умолчанию) - это не так это тяжело и хорошо работает. Вот небольшой пример:
Или, если вы хотите использовать
print
(оператор или функция, без разницы):win32console
Модуль позволяет вам делать гораздо больше интересных вещей с консолью Windows ... Я не большой поклонник WinAPI, но недавно я понял, что, по крайней мере, половина моей антипатии к ней была вызвана написанием кода WinAPI на C - пифонические привязки гораздо проще в использовании.Все остальные ответы, конечно, великолепны и питонны, но ... Что если я захочу напечатать в предыдущей строке? Или написать многострочный текст, чем очистить его и снова написать те же строки? Мое решение делает это возможным.
источник
для Python 2.7
для Python 3
источник
источник
Если вы просто хотите напечатать числа, вы можете избежать цикла.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 заняло 21,1986929975мс
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 заняло 491,466823551мс
источник
map
.Лучший способ сделать это - использовать
\r
персонажа.Просто попробуйте следующий код:
источник
В Python 3 вы можете сделать это следующим образом:
Выходы:
Кортеж: вы можете сделать то же самое с кортежем:
Выходы:
Другой пример:
Выходы:
Вы даже можете распаковать ваш кортеж так:
Выходы:
другой вариант:
Выходы:
источник
Запятая в конце оператора print пропускает новую строку.
но это не перезаписать.
источник
Для тех, кто боролся, как я, я придумал следующее, которое, кажется, работает как в Python 3.7.4, так и в 3.5.2.
Я расширил диапазон со 100 до 1000000, потому что он работает очень быстро, и вы можете не увидеть результат. Это связано с тем, что одним из побочных эффектов установки
end='\r'
является то, что последняя итерация цикла очищает весь вывод. Более длинный номер был необходим, чтобы продемонстрировать, что это работает. Этот результат может быть нежелателен во всех случаях, но в моем случае это было нормально, и OP не указывал так или иначе. Вы могли бы потенциально обойти это с помощью оператора if, который оценивает длину итерируемого массива и т. Д. Ключом, чтобы заставить его работать в моем случае, было объединение скобок"{}"
с.format()
. В противном случае это не сработало.Ниже должно работать как есть:
источник
Выход: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99
источник
Или даже проще:
end="\r"
перезапишет с начала [0:] первого отпечатка.источник