Печать в одной строке на ноутбуке jupyter

В python 3 мы можем легко распечатать в той же строке, используя следующий script. Я использую это, чтобы понять ход моего цикла (сколько времени осталось). Однако в jupyter он не работает (он печатает на разных строках)

import time
for f in range(10):
    print(f, end='\r', flush=True)
    time.sleep(10)

Он не работает, чтобы превратить довольно отпечаток с% pprint, и я попробовал то же самое с sys.stdout.write(), но и там у меня есть эта проблема.

Ответ 1

Обнаружил решение этой проблемы чуть позже (обратите внимание, что это не работает в Pycharm Jupyter, но только в реализации браузера). Для меня print работает нормально, но здесь рекомендуется использовать display, но он печатает апострофы вокруг строк.

from time import sleep
from IPython.display import clear_output, display

for f in range(10):
    clear_output(wait=True)
    print(f)  # use display(f) if you encounter performance issues
    sleep(10)

Изменение: Просто хотел добавить, что TQDM часто также является хорошим инструментом для этой цели. Он отображает индикаторы выполнения и позволяет записывать вывод под ним или отличать описание каждой панели. Смотрите также этот пост.

import sys
from tqdm import tqdm
from time import sleep

values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
    for i in values:
        pbar.set_description('processed: %d' % (1 + i))
        pbar.update(1)
        sleep(1)

И ноутбук один с приятными цветами

from tqdm import tqdm, tqdm_notebook
from time import sleep

for i in tqdm_notebook(range(2), desc='1st loop'):
    sleep(0.01)
    tqdm.write(f"Done task {i}")

Ответ 2

Часть "\ r" перезаписывает строку, если вы оставите ее в строке. Ваша версия print(f, end='', flush=False) может работать, но я читал в Python 3, вам нужно использовать sys.stdout.write(), и лучше всего, если вы добавите команду flush.

import sys
import time

for f in range(10):
    #delete "\r" to append instead of overwrite
    sys.stdout.write("\r" + str(f))
    sys.stdout.flush()
    time.sleep(10)

В некоторых системах требуется stdout.flush или вы не получите какой-либо вывод