кілька відбитків на одній лінії в 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
Це, мабуть, більше функція буферизації вихідних даних, виконаних ОС для процесу в цілому, що не є проблемою, характерною для пітона. Див. Stackoverflow.com/questions/107705 для вирішення конкретного пітона.
множинні

13
Без нового рядка, ймовірно, ви хочете явно промити буфер. Використовуйте print("...", end="", flush=True)в Python 3, в Python 2 додайте sys.stdout.flush()дзвінок.
Martijn Pieters

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 ("привіт")>
Mayank Jaiswal

@MayankJaiswal Це працює з паронами. print ('привіт'),
drglove

1
printФункція має дещо інший синтаксис у python 2 VS 3.
boldnik

52

Слід використовувати зворотну простір ' \ r ' або (' \ x08 повернутися на попередню позицію в консольному виході, ')

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

Пітон 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. Якщо ви використовуєте "\ x08" як резервну область, вам потрібно змити вихідний потік - print ((b '\ x08' * n) .decode (), end = '', flush = Правда)
Вадим Зін4ук

1
Повернення каретки "\ r" повертається до початку рядка, тому "* n" непотрібне
bjnortier

43

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


4
Я особисто віддаю перевагу цьому рішенню тим, хто проголосував вище, оскільки він працює точно так само як на python2.x та python3.x, не потрібно покладатися на __future__імпорт чи щось подібне.
mgilson

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

Найпростіші:

Пітон 3

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

Це означає, що він поверне курсор до початку, ніж надрукує щось і закінчиться в тому ж рядку. Якщо в циклі він почне друкувати там же, де він починається.


3
Класно! Працює і в Windows.
Shital Shah

2
Дякую, це прекрасно працює для мене! Я думаю, що print(’something to be override’, end=‘\r’)це простіше.
Тропіліо


9

Друк має необов’язковий endаргумент, це те, що надруковано в кінці кінців. За замовчуванням - це новий рядок, але ви можете змінити його на порожній рядок. напрprint("hello world!", end="")


2
Це в python 3. У python 2 можна просто print 'something',. Кома в кінці запобігає доданню нового рядка.
arjoonn

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.

У вашому випадку для ОП це дозволить консолі відображати відсоток завершеності встановлення як "панель прогресу", де ви можете визначити початкове та кінцеве положення символів та оновити маркери між ними.

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

4

Ось 2.7-сумісна версія, похідна від версії 3.0 від @ Vadim-Zin4uk:

Пітон 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 не використовує цілий аргумент, і, ймовірно, може бути ліквідований взагалі.

Пітон 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 ("Це Америка", end = "\ n"). Простий спосіб зробити це - зателефонувати до друку ("Це Америка", end = "")


1

На випадок, якщо ви попередньо зберегли значення в масиві, ви можете викликати їх у наступному форматі:

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

1

Python додає новий рядок як кінець для друку. Використовуйте end = '' для python3 для методу друку, щоб додати пробіл замість нового рядка. для 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, і код не працює навіть з правильним синтаксисом.
Cory Madden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.