morisita
@morisita

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonの複数行の出力を上書きで書き換えたい

解決したいこと

jupyterlabもしくはjupyternotebook上でのpythonでキャリッジリターン(\r)を使うと同じ行を上書きするように出力できますが、行をさかのぼって上書きするにはどうしたらよいのでしょうか? "\033[nA"でできるという記事もあるのですが、jupyterでは思うとうりにはいかないようです。
よろしくお願いいたします

0

3Answer

以前の行に遡って編集するには表示されているターミナル画面全体を制御する必要があります。Cursesを使う実装が多いと思いますが、かなりの前準備と後片付けが必要なので、今のスクリプトにちょっと付け足す感じにはなりません。
出力順をうまく工夫して、遡らないやり方を考える方が簡単だと思います。
ちなみに、\rはエスケープシーケンスと呼ばれる特殊文字です。\rは行頭に戻るので、そこから同じ行を上書きすることで書き換えているように見えます。

2Like

Comments

  1. @morisita

    Questioner

    お返事ありがとうございます。pythonで出来ないこともあるんですね。

処理中のコードの出力をまっさらにすることはできます.

数行だけ遡るのはちょっと無理そうかも.
まあそれが必要なら普通のShellでいいですしまあ.

0Like

Comments

  1. @morisita

    Questioner

    お返事ありがとうございます。これは
    IPython.displayのclear_outputとは別物ですかね?

"\033[nA"でできるという記事もあるのですが、

ANSIエスケープシーケンス とも言いますが、VT100 などのターミナルへの出力なら可能です。

ほぼ どの Unix系 OS でも使えるはずですが、Windows OS のコマンドプロンプトでは使えないと思います。

元々、Cursesという、C言語ライブラリがあって、それをPythonから使えるようにしたライブラリもあるようですが、これが Jupyter で機能するかどうかは、自分は知りません。やってみるしか無いです。

0Like

Comments

  1. ↓ この Jupyterlab の Terminal なら使えそうな気がしますが、
    pip install jupyter-consoleをどこで実行するのか、分かりません。

  2. This comment has been deleted for violation of our Terms of Service.
  3. @morisita

    Questioner

    お返事ありがとうございます。jupyterlab on ubuntuでも駄目でした。

  4. This comment has been deleted for violation of our Terms of Service.
  5. @morisita

    Questioner

    notebookやlabのweb画面でもメニューからfile>new>terminalというのはあるのですが、私が使っているのはfile>new>Notebookで、ipynbファイル上での話です。

  6. This comment has been deleted for violation of our Terms of Service.
  7. @morisita

    Questioner

    terminalでpython使ってる人は結構多いのですか?僕は初めからjupyterlabだったので****.pyみたいなプログラムは私的ライブラリー用に作るくらいで。。。
    一行で済めば'\r'でいいのですが、表示したい情報が多く、一行にいろんな情報が更新されていくと分かりにくいので、行を変えて出力したかった次第です。

  8. 表示したい情報が多く、一行にいろんな情報が更新されていくと分かりにくいので、行を変えて出力したかった次第です。

    '\r'とか使わずに普通にprint()すればいい気がします。
    例えば、3行でひと塊り(3行さかのぼって上書き出力したかった)とすると、
    4行目に空白行を出力すれば、大量に出力されても、かたまりごとに見やすと思います。

    もしくは、
    n行さかのぼって上書きするということは、結局は、途中経過は消えて残らず、最後に出力したものだけが最終的に残るわけなので(途中の情報は最終的には不要ということで)、
    '\r'を使って途中経過の情報は1行だけ出力するようにして、最後に最終結果を必要な行数だけ出力するのはどうですか。

  9. @morisita

    Questioner

    お返事ありがとうございます。説明が足らずすいません。
    作っているプログラムは何台かある計測器のデータを取得しつつ表示するプログラムで、出力の一番上にはグラフのパネルが6枚ほど表示されていて、その下に文字情報で数行の計測器のステータスなどが表示されるようになっています。なので、グラフの下に何行も情報が流れて行かれるとこれはこれで視認性が悪いなと思った次第です。

  10. This comment has been deleted for violation of our Terms of Service.
  11. @morisita

    Questioner

    terminalでプログラムを実行すると言うことが全くなかったので、食い違ってしまいましたすいません。ちなみにterminalで実行すれば、windowsでもubuntuでも"\033[nA"は有効でした。ただ、matplotlibのplotは表示できないようで、私の希望には沿わないようでした。@dameyodamedameさんの最後の方法はうまく行くようです。out.valueの書き方がよくわかりませんが、これから調べてみます
    ありがとうございました

Your answer might help someone💌