💨

Jupyter で出力セルを空にする

2021/12/08に公開

はじめに

Jupyter Notebook の出力セルを空にしたいという場合があります。ケースに応じていくつかパターンを示します。

1. 作業中のノートの出力セルを削除する

メニューの Cell > All Output > Clear から出力セルを削除できます。目視確認できるのが良いですね。

2. 作成済みのノートから出力セルを削除する

nbconvert --clear-output を使います。 --output オプションで出力先指定、 --inplace オプションで上書きになります。

2-1. 新規作成

jupyter nbconvert --clear-output --to notebook \
  --output=EmptyOutputCell.ipynb Input.ipynb

2-2. 上書き

jupyter nbconvert --clear-output --inplace \
  Input.ipynb

git の pre-commit フックに以下のようなものを仕掛けておけばリポジトリーで空のノートのみ管理できますが、コミットする度にノートが空になってしまうことが必ずしも良いとも限らないので必要があれば設定します。

git diff -z --cached --name-only --diff-filter=ACM \
  | grep -zZ -e '\.ipynb$' \
  | xargs -0 jupyter nbconvert --clear-output --inplace
git diff -z --cached --name-only --diff-filter=ACM \
  | xargs -0 git add

3. ノート保存時に出力セルを削除したファイルを作成する

jupyter_notebook_config.py に post_save_hook を指定します。

ClearOutputPreprocessor は出力セルを削除するプリプロセッサーで、前述の nbconvert --clear-output でも利用されているものです。

def export_clean_notebook(model, os_path, contents_manager, **kwargs):
    import io
    import os
    from nbconvert.exporters import NotebookExporter
    from nbconvert.preprocessors import ClearOutputPreprocessor

    if model['type'] != 'notebook':
        return

    exporter = NotebookExporter(parent=contents_manager)
    exporter.register_preprocessor(ClearOutputPreprocessor(), True)
    notebook, _ = exporter.from_filename(os_path)

    base, _ = os.path.splitext(os_path)
    notebook_filename = base + '.clean.ipynb'
    with io.open(notebook_filename, 'w', encoding='utf-8') as f:
        f.write(notebook)


c.FileContentsManager.post_save_hook = export_clean_notebook

保存時に元のファイル名の拡張子を .clean.ipynb に変更した、出力セルを空にしたノートファイルを出力します。

Discussion