несколько отпечатков на одной строке в Python


229

Я хочу запустить скрипт, который в основном показывает вывод, как это:

Installing XXX...               [DONE]

В настоящее время я печатаю Installing XXX...сначала, а затем печатаю [DONE].

Впрочем, теперь я хочу печатать Installing xxx...и [DONE]на одной строчке.

Любые идеи?



1
Ответы на этот вопрос не упоминают, что иногда вы хотите очистить линию, см .: stackoverflow.com/questions/45263205
ideasman42

Ответы:


284

Вы можете использовать printоператор, чтобы сделать это без импорта sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

Запятая в конце printстроки не позволяет printвыдать новую строку (вы должны заметить, что в конце вывода будет дополнительный пробел).

Решение Python 3
Поскольку вышеприведенное не работает в Python 3, вы можете сделать это вместо этого (опять же, без импорта sys):

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

Функция печати принимает endпараметр по умолчанию "\n". Установка его в пустую строку предотвращает выдачу новой строки в конце строки.


1
Работает отлично. До сих пор видел только решения stdout. Очень приятно это знать.
Прометей

5
Это не сработает, если у вас есть оба отпечатка и между ними много времени (все на одном уровне функции / отступа). Перед началом действия вывод вообще отсутствует, а после его завершения вывод выводится как целое
Paddre

2
Вероятно, это скорее функция буферизации вывода, предварительно сформированная ОС для всего процесса, что не является проблемой, специфичной для python. См. Stackoverflow.com/questions/107705 для конкретного обходного пути для Python.
множественные

13
Без новой строки вы, вероятно, захотите явно очистить буфер. Используйте print("...", end="", flush=True)в Python 3, в Python 2 добавьте sys.stdout.flush()вызов.
Мартин Питерс

7
в python 3.x вы захотите добавить «\ r» в конец, чтобы заменить напечатанную строку VS, добавляя в конец ееprint("Progress: {}%".format(var), end="\r", flush=True)
Джон

103

Вы можете просто использовать это:

print 'something',
...
print ' else',

и на выходе будет

something else

не нужно перегибать import sys. Обратите внимание на запятую в конце.

Python 3+ print("some string", end=""); для удаления вставки новой строки в конце. Читать подробнееhelp(print);


3
Обратите внимание, что есть два пробела с помощью этого метода
ethanjyx

1
Это самый простой и эффективный ответ.
gixxer

Это не работает, когда аргументы print указаны в скобках. Это работает: <print "привет" ;; print ("hello")> но это не работает <print ("hello",); печать ("привет")>
Mayank Jaiswal

@MayankJaiswal Это работает с Parens. печать ('привет'),
drglove

1
printФункция имеет немного другой синтаксис в Python 2 VS 3.
Болдник

52

Вы должны использовать backspace ' \ r ' или (' \ x08 ') char, чтобы вернуться на предыдущую позицию в выводе консоли

Python 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

Этот код будет считать от 0% до 100% в одной строке. Конечное значение будет:

> python test.py
100%

Дополнительная информация о сбросе в этом случае здесь: Почему операторы печати python, содержащие аргументы 'end =', ведут себя по-разному в циклах while?


1
Чтобы уточнить, похоже, что закомментированный код в этом примере предназначен для Python 2, а некомментированные строки - для Python 3.
Черепахи милые

1
В Python 3 строки будут отлично работать Правда)
Вадим Зин4ук

1
Возврат каретки «\ r» возвращается к началу строки, поэтому «* n» не
требуется

43

Используйте sys.stdout.write('Installing XXX... ')и sys.stdout.write('Done'). Таким образом, вы должны добавить новую строку вручную, "\n"если хотите восстановить функциональность печати. Я думаю, что может быть ненужным использовать проклятия только для этого.


4
Лично я предпочитаю это решение более высокому, потому что оно работает точно так же на python2.x и python3.x без необходимости полагаться на __future__импорт или что-то подобное.
Мгилсон

17

Ни один из ответов не сработал для меня, так как все они остановились, пока не встретилась новая строка. Я написал простой помощник:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

Чтобы проверить это:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

«Привет» сначала распечатает и промокнет на экран перед сном. После этого вы можете использовать стандартную печать.


1
Спасибо! Именно то, что мне нужно, иначе .flush ()
MrNice


11

Самое простое:

Python 3

    print('\r' + 'something to be override', end='')

Это означает, что он вернет курсор в начало, затем напечатает что-то и закончится в той же строке. Если в цикле он начнет печатать там же, где и начнется.


3
Прохладно! Работает и в Windows.
Шиталь Шах

2
Спасибо, это прекрасно работает для меня! Я думаю, что print(’something to be override’, end=‘\r’)это проще, хотя.
Тропилио


9

Print имеет необязательный endаргумент, это то, что напечатано в конце. По умолчанию используется новая строка, но вы можете изменить ее на пустую строку. напримерprint("hello world!", end="")


2
Это в Python 3. В Python 2 вы можете просто print 'something',. Запятая в конце предотвращает добавление новой строки.
Арджунн

4

Если вы хотите переписать предыдущую строку (а не постоянно добавлять к нему), вы можете комбинировать \rс print(),в конце заявления печати. Например,

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

будет считать от 0 до 9, заменяя старый номер в консоли. "...DONE!"Будет печатать на той же строке, что и последний счетчик, 9.

В вашем случае для OP это позволило бы консоли отображать процент завершения установки в виде «индикатора выполнения», где вы можете определить начальную и конечную позицию символа и обновить маркеры между ними.

print("Installing |XXXXXX              | 30%"),

4

Вот 2.7-совместимая версия, полученная из версии 3.0 от @ Vadim-Zin4uk:

Python 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

В этом отношении предлагаемое решение 3.0 выглядит несколько раздутым. Например, метод backspace не использует целочисленный аргумент и, вероятно, может быть полностью исключен.

Python 3

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

Оба были проверены и работают.


2

Это очень старая тема, но вот очень подробный ответ и пример кода.

\rявляется строковым представлением возврата каретки из набора символов ASCII. Это то же самое, что восьмеричное 015[ chr(0o15)] или шестнадцатеричное 0d[ chr(0x0d)] или десятичное 13[ chr(13)]. Смотрите man asciiдля скучного чтения. Это ( \r) довольно переносимое представление, и его легко читать людям. Это очень просто означает переместить каретку на пишущей машинке полностью назад к началу, не продвигая бумагу. Это CRчасть, CRLFкоторая означает возврат каретки и перевод строки .

print()это функция в Python 3. В Python 2 (любая версия, которая вас заинтересует) printможно принудительно ввести в функцию, импортировав ее определение из __future__модуля. Преимущество printфункции заключается в том, что вы можете указать, что печатать в конце, переопределяя поведение по умолчанию \nдля печати новой строки в конце каждого print()вызова.

sys.stdout.flushговорит Python сбросить вывод стандартного вывода , куда вы отправляете вывод, print()если не указано иное. Вы также можете получить такое же поведение, запустив с python -uили установки переменной окружения PYTHONUNBUFFERED=1, тем самым пропуская import sysи sys.stdout.flush()звонки. Сумма, которую вы получаете за это, практически равна нулю, и ее не очень легко отладить, если вам удобно забыть, что вы должны сделать этот шаг, прежде чем ваше приложение будет работать должным образом.

И образец. Обратите внимание, что это отлично работает в Python 2 или 3.

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

Я думаю, что ваш ответ больше подходит для: stackoverflow.com/questions/45263205/…
Marc Cayuela Rafols

2

print () имеет встроенный параметр "end", который по умолчанию имеет значение "\ n". Вызов print ("Это Америка") фактически вызывает print ("Это Америка", end = "\ n"). Самый простой способ сделать это - вызвать print ("Это Америка", end = "")


1

Если вы предварительно сохранили значения в массиве, вы можете вызвать их в следующем формате:

for i in range(0,n):
       print arr[i],

1

Python добавляет символ новой строки как конец для печати. Используйте end = '' для python3 для метода print, чтобы добавить пробел вместо новой строки. для python2 используйте запятую в конце оператора print.

print("Foo",end=' ')
print('Bar')

0

Нашел этот пост Quora , с этим примером, который работал для меня (python 3), который был ближе к тому, для чего я нуждался (т.е. стирал всю предыдущую строку).

Пример, который они предоставляют:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

Для печати на той же строке, как предлагали другие, просто используйте end=""


-2

Я нашел это решение, и оно работает на Python 2.7

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

1
Это printнеправильный синтаксис для Python 2.7, и код не работает даже с правильным синтаксисом.
Кори Мэдден
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.