6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Python] コンソール出力を同じ行に上書きするメモ

Last updated at Posted at 2023-03-20

はじめに

メッセージをコンソールの同じ行に上書きして出力したい場合に、キャリッジリターンを使うと簡単に出来ます。
しかし、後続するメッセージが前のメッセージより短い場合は、出力が綺麗になりません。
単純に前のメッセージと同じ文字数になるだけ末尾に空白文字足してを出力すると綺麗な見た目にはなります。
ただ、これだと力技なのでConsole Virtual Terminal Sequencesを使った方法のメモです。

サンプル

  1. test1: 単純な方法。見た目が悪くなる。
  2. test2: 力技。ただ環境に依存しない。
  3. test3: Console Virtual Terminal Sequencesを使える場合は、これで綺麗に出来る。環境に依存する。
python
import sys
import time
import random


def getRandomStr(string="abcdefghijklmnopqrstuvwxyz", rMin=1, rMax=10):
  return "".join(random.choices(string, k=random.randint(rMin, rMax)))


def test1():
  print(f"start: {sys._getframe().f_code.co_name}")
  for i in range(11):
    print(f"\r{i:2}: {getRandomStr()}#", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


def test2():
  print(f"start: {sys._getframe().f_code.co_name}")
  oldLen = 0
  for i in range(11):
    str = getRandomStr() + "#"
    l = len(str)
    if l < oldLen:
      str += " " * (oldLen - l)
    oldLen = l
    print(f"\r{i:2}: {str}", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


def test3():
  print(f"start: {sys._getframe().f_code.co_name}")
  for i in range(11):
    str = getRandomStr()
    print(f"\r\x1b[1M{i:2}: {str}#", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


test1()
test2()
test3()

参考

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?