Python '\ r' печатает на той же строке, но не стирает предыдущий текст - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь распечатать отчет для каждой итерации.Поскольку каждая итерация выполняется очень долго, поэтому я использую print вместе с end="\r", чтобы показать текущий обрабатываемый элемент.Вот фиктивный код:

import time
y = list(range(50))

print("epoch\ttrain loss\ttest loss\ttrain avg\ttest avg\ttime\tutime")
for e in range(10):
    for i in range(50):
        print("training {}/{} batches".format(i,50), end = '\r')
        time.sleep(0.05)
    print('{}\t{:2f}\t{:2f}\t{:2f}\t{:2f}\t{:2.1f}\t{:2.1f}'.format(y[0]+e,y[1]+e,y[2]+e,y[3]+e,y[4]+e,y[5]+e,y[6]+e)) 

Ожидаемый результат

enter image description here Это мой ожидаемый результат, когда информация о ходе выполнения полностью стирается после каждой итерации.(Я запускаю его в ноутбуке Jupyter, и он выглядит нормально)

Результат, который я получаю

enter image description here Однако, когда я запускаю его на терминале Linuxинформация о прогрессе удаляется не полностью, а результат накладывается поверх прогресса.

Почему это так?Как это решить?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

\r просто перемещает курсор назад к началу текущей строки.Все, что напечатано после \r, напечатано «поверх» ранее существовавшего содержимого.На реальном принтере / телетайпе это было бы буквально так, чтобы два символа печатались в одной и той же позиции («перегружены»).В терминале новые символы заменяют старые (но только в тех положениях, в которые вы действительно пишете).

Вы можете воспользоваться этим поведением терминалов, печатая пробелы.Вам нужно как минимум столько пробелов, сколько содержимого вы хотите стереть, но этого недостаточно для переноса терминала на следующую строку (это может быть невозможно, если строка была напечатана до последнего символа).
Inв вашем случае вы знаете, что длина строки не будет превышать 22 символов, поэтому вы можете использовать end='\r \r' (вернитесь к началу строки, напечатайте 22 пробела, а затем снова вернитесь к началу строки).

0 голосов
/ 28 сентября 2019
Опция

\r установит (переместит) курсор для запуска.Это не очистит текст.Вы должны убедиться, что ваши напечатанные данные имеют достаточно места для перезаписи предыдущих напечатанных данных или имеют ту же длину, так как простое перемещение к той же строке не приведет к автоматическому удалению предыдущего содержимого.

...