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だけ黄色くしたりできる。詳しくはエスケープシーケンス一覧などで検索すればいくらでも出てくるだろう。量が多すぎるのでここには書かない。まだまだ知らないことが多い

ちなみにプログレスバーtqdmを使っている。