💨
Jupyter で出力セルを空にする
はじめに
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