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

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

Installing XXX...               [DONE]

Теперь, на данный момент, я использую печать для печати всей строки ПОСЛЕ завершения функции. Однако теперь я хочу, чтобы он сначала напечатал "Установка xxx..." и ПОСЛЕ запускаемой функции, чтобы добавить тег "DONE"; но в той же строке.

Любые идеи?

Ответ 1

Вы можете использовать оператор 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". Установка его в пустую строку не позволяет ему выдавать новую строку в конце строки.

Ответ 2

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

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

и выход будет

something else

нет необходимости переполнять import sys. Обратите внимание на символ запятой в конце.

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

Ответ 3

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

Ответ 4

Вы должны использовать 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?

Ответ 5

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

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')

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

Ответ 7

Этот простой пример напечатает 1-10 в той же строке.

for i in range(1,11):
    print (i, end=" ")

Ответ 8

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

Ответ 9

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

Python 3

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

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

Ответ 10

Если вы хотите перезаписать предыдущую строку (а не постоянно добавлять к ней), вы можете объединить \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%"),

Ответ 11

Вот 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

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

Ответ 12

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

\r - строковое представление возврата каретки из набора символов ASCII. Это то же самое, что и восьмеричный 015 [chr(0o15)] или hexidecimal 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()

Ответ 13

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

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

Ответ 14

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

Ответ 15

Я нашел это решение, и он работает над 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