Добавить к предыдущей строке - PullRequest
1 голос
/ 12 апреля 2019

Я делаю обработку папок / файлов в Python.Чтобы уведомить пользователя, я вывожу некоторые сообщения на консоль.Эти сообщения выглядят примерно так:

Creating folders...
DONE
Creating files...
DONE
All done!

Это нормально, если процесс короткий, но в моем случае процесс (и сообщения) не короткий.Я не хочу тратить новые строки на сообщения об успехе / неудаче.Я хочу, чтобы они выглядели так:

Creating folders... DONE
Creating files... DONE
All done!

Хитрость заключается в том, чтобы строки "DONE" добавлялись к предыдущей строке после выполнения конкретной задачи.Итак, сначала я просто вижу:

Creating folders...

, и когда задача выполнена, она становится:

Creating folders... DONE

и переходит к следующей задаче.Я пытался не заканчивать строки, но это не сработало:

print("Creating folders... ", end="")
time.sleep(2) # fake process
print("DONE")
time.sleep(1)
print("Creating files... ", end="")
time.sleep(2)
print("DONE")

Ну, это работает, но обе строки (задача ... результат) отображаются одновременно (после задачи)готово).Я не вижу перехода, о котором я упоминал выше.

Я нашел другой путь, переместился в начало строки и заменил строку:

print("Creating folders... ", end="\r")
time.sleep(2) # fake process
print("Creating folders... DONE")
time.sleep(1)
print("Creating files... ", end="\r")
time.sleep(2)
print("Creating files... DONE")

Кажется, этоПроизведите желаемый эффект, но я повторяю и расширяю предыдущее сообщение.Я предпочел бы просто вывести результат, а не повторять сообщение задачи снова.

Есть ли более простое решение для этого?


Кроме того, почему не первый метод I 'мы пробовали работать?Я печатаю текст, а не заканчиваю строку.Через некоторое время я добавляю другой текст, и он добавляется к предыдущей строке, потому что нет перевода строки.Поскольку между двумя отпечатками есть разница во времени, я должен видеть переход, но я не вижу.Они печатаются одновременно.Почему это так?

1 Ответ

5 голосов
/ 12 апреля 2019

Необходимо очищать буфер после каждого оператора печати (который использует end=""), чтобы гарантировать, что сообщения будут немедленно переданы на консоль.См. print () документацию.

Рабочий пример с параметром сброса функции печати:

import time

print("Creating folders... ", end="", flush="True")
time.sleep(2)  # fake process
print("DONE")
time.sleep(1)
print("Creating folders... ", end="", flush="True")
time.sleep(2)
print("DONE")

Рабочий пример с ручной промывкой:

import time
import sys

print("Creating folders... ", end="")
sys.stdout.flush()
time.sleep(2) # fake process
print("DONE")
time.sleep(1)
print("Creating files... ", end="")
sys.stdout.flush()
time.sleep(2)
print("DONE")

Смотрите это в действии!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...