pythonでターミナル上のカーソルを上に移動する
プログレスバーなどを作りたいときにsys.stdout.write("~\r")
のような感じでキャリッジリターンを使っていたがこれだとカーソルを行頭には戻せるがn行上には戻せない。なので全ての情報を1行に記述するしかなく表示する情報に限界がある。カーソルの移動くらい方法があるだろうと調べてエスケープシーケンスにたどり着いた。ターミナル上のカーソルの移動や文字の削除などができる特殊文字列のようだ。キャリッジリターンもそうだったんだな。知らんかった。
使い方はESC[**
といった感じでこれをディスプレイに送る。ESCは\033
もしくは\x1b
のどっちでもいい。やりたいことに応じて**の部分を変更する。例えばカーソルをn行上に移動するには\033[nA
と書く。なのでカーソル3行上に移動させるには
print("\033[3A")
とすればいい。カーソルを上の行に移動できるのでprintでも問題ない。他にも\a
でアラート音を出したり、\033[y;xH
でコンソールのy行x列にカーソルを移動できたり、print("hoge\033[33mhoge\033[0mhoge")
で真ん中のhogeだけ黄色くしたりできる。詳しくはエスケープシーケンス一覧などで検索すればいくらでも出てくるだろう。量が多すぎるのでここには書かない。まだまだ知らないことが多い