Python: несколько отпечатков на одной строке - PullRequest
200 голосов
/ 08 апреля 2011

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

Installing XXX...               [DONE]

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

Есть идеи?

Ответы [ 14 ]

3 голосов
/ 10 января 2018

Здесь 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 голосов
/ 25 октября 2017

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

\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()
1 голос
/ 17 октября 2016

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

for i in range(0,n):
       print arr[i],
0 голосов
/ 07 декабря 2016

Я нашел это решение, и оно работает на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...